2

私はシンプルな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 に置き換えます。

4

4 に答える 4

4

タブバーを使っていると思いますよね?

もしそうなら、このように考えてください。MainWindow xibで定義された各タブは、カスタムView Controllerタイプとして定義する必要があります。これは、タブバーがロードされたときに作成されるタイプであるためです。タブバーは、ロード時に定義されたタブごとにビューコントローラを作成します。

カスタムビューの配線には何も接続されないため、任意のビューコントローラのインスタンスを作成してから、カスタムNIBをロードするだけでは不十分です(これは、定義したタブバーが現在実行していることです)。

したがって、MainWindow.xibの各タブで定義されている各View Controller(IBのツリービューを使用してこれを調べる)が、ファイルの所有者を設定する必要があるカスタムXIBを指すことに加えて、正しいカスタムUIViewControllerタイプに設定されていることを確認してください正しいタイプに変更します(ただし、基本的なビュー以外のものをファイル所有者に配線する場合にのみ重要です)。

于 2009-01-05T06:27:20.673 に答える
0

私は同じ間違いをしました。

問題は、PersonListViewController.m のターゲットを設定していないことです。

PersonListViewController.m の情報に移動し、ターゲット セクションを選択して、アプリのターゲットがチェックされていることを確認します。

于 2010-07-17T07:23:03.650 に答える
0

例外から、バインドが適切に行われなかったようです。メソッドのシグネチャは、例外から判断して正しくないようです。ボタン アクションは、戻り値の型が IBAction のメソッドにリンクされていますか? メソッドのシグネチャは

-(IBAction) メソッド名;

于 2009-01-05T08:27:20.713 に答える
0

xib の名前を変更しても、その xib の内容にはまったく影響しません。使用しているサブクラスを変更したい場合は、情報パネルでクラス名を変更する必要があります

于 2009-01-05T02:05:46.647 に答える