私はシンプルなiPhoneアプリに取り組んでいます。
1 つの UINavigationController と 2 つの UIViewController のサブクラスがあります。
MainWindow.xib ファイル、PersonListView.xib、および PersonDetailView.xib があります。
MainWindow.xib には、ビューが PersonListView.xib ファイルにリンクされた UINavigationController があります。
PersonListView.xib には、ファイルの所有者が PersonListViewController クラスとしてリストされています。
ラベルと画像とともに、PersonListView にいくつかのボタンがあります。すべて正しく表示されます。
PersonListView のボタンを PersonListViewController クラスにリンクしようとすると、ボタンが起動しません....
結果: * キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '* -[UIViewController viewDetail]: 認識されないセレクターがインスタンス 0x450d50 に送信されました'
デバッグ コンソールにアクセスしてオブジェクト 0x450d50 を出力すると、次のようになります。
(gdb) 印刷オブジェクト 0x450d50 (gdb)
Interface Builder はファイルの所有者を PersonListViewController として正しく表示しますが、なぜボタン アクション (ファイルの所有者にリンクされている) がスーパークラスに移動するのでしょうか?
EDIT1: わかりました。MainWindow.xib でビュー コントローラーのクラスをサブクラスに明示的に設定しない限り、サブクラスのインスタンスを取得していないようです。
メインウィンドウからNIBファイル名を交換するだけで、UIViewControllerの任意のサブクラスを起動できるはずなので、まだ足りないものがあるはずです?
EDIT2: (Kevin への応答) それは、XIB の内容に関して私が言っていることではありません。
私は3つのXIBを持っています:
メインウィンドウ PeopleListView PeopleDetailView
PeopleListView と PeopleDetailView にはそれぞれ、対応する UIViewController サブクラスであるファイルの所有者が関連付けられています。明らかに、ページからページに移動するときに、イベントが適切なコントローラー クラスに移動する必要があります...しかし、デフォルトの UIViewController または 1 つのサブクラスしか使用できない場合、それははるかに難しくなりますか?
正しいルートで UINavigationController を手動で設定することにより、コードで正しい効果を得ることができますが、InterfaceBuilder を使用するより良い方法があるはずです。
EDIT3: (Kendall に) 私はタブ バーを使用していません。ただし、モデルは同じですが、ナビゲーション コントローラーのビューを単一のサブクラスに接続する必要があり、少し面倒です。
EDIT4: (lostintransit へ) PersonListViewController には適切な - (IBAction) viewDetail があります。方法。問題は、MainWindow.xib で、UINavigationController 内のビューに「PersonListViewController をビューとして使用して、最初にこれを PersonListView.xib からロードする」というフラグを立てる方法が見つからないことです。 PersonListView を PersonDetailView に置き換えます。