1

Xcodeに付属し、 http: //developer.apple.com/library/ios/#documentation/iPhone/Conceptual/SecondiOSAppTutorial/で参照されているMaster-Detailプロジェクトテンプレートを使用しています。

問題:このテンプレートに付属してUIViewControllerいるデフォルトにを追加する方法を理解しようとしています。UINavigationController

DetailEditViewController具体的には、 afterを追加したいと思いDetailViewControllerます。これまでにこの効果に対して行ったことは次のとおりです。

DetailViewController編集ボタンを追加しましたnavigationItem

- (void)viewDidLoad
{
    [super viewDidLoad];       
    self.navigationItem.rightBarButtonItem = 
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
                                                      target:self 
                                                      action:@selector(editDetailItem:)];
    [self configureView];
}

editDetailItem:あなたはそれが私が次のように実装したメッセージセレクターを指定しているのを見ることができます:

- (void)editDetailItem:(id)sender
{
    [self.navigationController pushViewController:
        [[DetailEditViewController alloc] init] animated:YES];
}

ストーリーボードでを作成しましたがDetailEditViewController、コードはクラッシュせずに実行され、詳細に戻るためのナビゲーションアイテムを含む黒い空白のウィンドウが生成されます。ここから私はかなり混乱しています:

  • 新しいViewControllerをストーリーボードにドラッグすると、対応するコードファイルが作成されません。これらのコントローラーのコードファイルを作成する責任はありますか?Storyboard ViewControllerがIdentityInspectorのクラスに関連付けられているのがわかりますがUIViewController、ストーリーボードにドラッグしたときに、なぜ新しいテンプレートが作成されないのでしょうか。
  • -pushViewControllerからDetailViewController移動する代わりに、セグエを使用する必要がありDetailEditViewControllerますか?もしそうなら、ストーリーボードに1つ追加する方法がわかりません。これは、navigationItem'sUIBarButtonItemがすべてコード内に追加されているためです。Ctrlキーを押しながらドラッグするものは何もありません。
  • DetailViewControllerからに情報を送信するにはどうすればよいDetailEditViewControllerですか?にMasterViewControllerセグエするとき、それは経由をDetailViewController指定しますsender- prepareForSegue:sender:
4

1 に答える 1

2

そうです、対応するファイルは作成されません。システムはどのようにあなたが望むクラスを知ることになっていますか?UIViewControllerサブクラスを作成し、ドラッグインしたコントローラーのクラスをそのクラスに変更する必要があります。新しいコントローラーをプッシュする最も簡単な方法は、プッシュセグエを使用することです。ストーリーボードに接続するUI要素がない場合は、コントローラーから直接接続して、セグエに識別子を付けます(これを私は呼び出します)。私の例では「GoToEdit」)。編集ボタンのアクションメソッドで、セグエを実行します。

[self performSegueWithIdentifier:@"GoToEdit" sender:self];

情報を渡したい場合は、prepareForSegue:を実装します。次のようになります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"GoToEdit"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = _objects[indexPath.row];
        [[segue destinationViewController] setDetailItem:object];
    }
}

最初にセグエ識別子を確認するのは良いことです。次に、destinationViewControllerにアクセスし(クラスにキャストする必要がある場合があるため、コンパイラーは設定しようとしているプロパティを認識します)、必要なものを渡します。

于 2013-02-14T19:16:37.753 に答える