11

iPadアプリケーションを作成するために分割ビューを使用するのは初めてです。標準のMasterDetailアプリケーションテンプレート(Xcode 4.2)を使用してプロジェクトを最初に作成すると、MasterViewControllerとDetailViewControllerが作成されます。テンプレートには、ポップオーバーテーブル(マスター詳細ビューコントローラ)から行が選択されたときに呼び出される次のメソッドがあります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

if (!self.detailViewController) 
{
    self.detailViewController = [[DetailViewController alloc]        initWithNibName:@"DetailViewController" bundle:nil]; 
}
[self.navigationController pushViewController:self.detailViewController animated:YES];

iPhone用にプログラミングしている場合、通常のナビゲーションコントローラーを使用しているときに、このタイプの操作を実行して、別のViewControllerをスタックにプッシュすることを理解しました。ただし、このテンプレートでは、既存のものを更新するのではなく、詳細ビューをポップオーバーにプッシュするだけです。ポップオーバー(マスター詳細ビュー)から何かを選択し、detailViewを更新するには、何を更新する必要があるのか​​混乱しています。

アップデート:

DetailViewControllerですでに設定されている「detailItem」をテストするために、pushViewControllerをコメントアウトして、以下を追加しました。

//[self.navigationController pushViewController:self.detailViewController animated:YES];
self.detailViewController.detailItem = @"Test";

// setter in detailViewController
- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;

        // Update the view.
        [self configureView];
    }

    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    }        
}

- (void)configureView
{
    // Update the user interface for the detail item.
    // detailDescriptionLabel.text is a IBOutlet to the label on the detailView
    if (self.detailItem) {
        self.detailDescriptionLabel.text = [self.detailItem description];
    }
}

このコードによると、detailViewControllerのラベルのテキストを更新する必要があります。ただし、マスタービューコントローラテーブルの項目をクリックしても何も起こりません。

4

1 に答える 1

8

あなたがそれを行うことができるいくつかの異なる方法があります。最初に、あなたが言ったように、pushViewController呼び出しを削除します (なぜ Apple のテンプレートがこれを行うのかわかりません...おそらく、できることを示すためだけですか?)。

次に、すでに表示されている DetailViewController を MasterViewController に知らせます。私は通常、 に設定master.detailViewController = detailViewControllerappDelegateます。

DetailViewController は既に表示されているため、常に再割り当てする必要はありません (他のビューに置き換えない限り)。

最初のオプション

デリゲート呼び出しを使用して情報を設定します。detailView に情報を渡すプロトコルを宣言し、適切に表示させます。これをより詳細に説明するチュートリアルがあります

2 番目のオプション

DetailViewController にデータを渡し、セッターをオーバーライドして、detailView を更新します。これをより詳細に説明するチュートリアルがあります

// in DetailViewController    
- (void)setDetailItem:(id)newDetailItem {
        if (detailItem != newDetailItem) {
            [detailItem release];
            detailItem = [newDetailItem retain];

            // Update the view.
            navigationBar.topItem.title = detailItem;
        NSString * imageName = [NSString stringWithFormat:@"%@.png",detailItem];
        [self.fruitImageView setImage:[UIImage imageNamed:imageName]];
        }
    }

編集:テンプレートをもう一度見てみると、setDetailItemタイプコードはすでにそこにありますが、コードは完全に新しいdetailViewを作成しているため、splitViewControllerで表示可能なdetailViewはまったく変更されません。

于 2011-10-28T19:10:44.063 に答える