0

ビューにボタンがあるビューコントローラーを持つ単純なテストアプリ(OSX)があります。ボタンのアクション メソッドはビュー コントローラーのクラスにあり、その IBAction は (ファイルの所有者を介して) IB に接続されます。ボタンがクリックされると、EXC_BAD_Access エラーが発生します (ただし、代わりに -[NSRunLoop buttonClick:] が発生する場合があります)。ここで、レスポンダーチェーンにない NSViewControllers に関係する SO に関する多くの投稿を読みましたが、IB でアクションメソッドを具体的にフックすることも機能するはずです。私が持っている唯一のコードはこれです:

アプリのデリゲートで:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    TestController *controller = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];
    [self.window.contentView addSubview:controller.view];
}

そして、TestController クラスでは、次のようになります。

-(IBAction)buttonClick:(id)sender {
    NSLog(@"%@",sender);
}

2 つの質問があります。なぜこれが起こっているのですか? また、ボタン メソッドの IBActions を配置する正しい mvc の場所はどこですか (コントローラー クラスがこれらを処理するべきではありません)。

4

3 に答える 3

0

NSViewControllerはiPhoneのmacosxのIBActionsに応答しませんビューはコンテンツ(データ)を描画するだけで変更しないため、IBActionを配置するのに適切な場所です。ただし、Mac os xでは、NSViewControllerはNSViewを設定するためのものであり、IBActionに応答することはできません。2つの選択肢があります。1つは、IBActionをNSViewに配置するか、NSWindowControllerを作成することです。mac osxでは、十分な画面スペースがあり、常にウィンドウ内にビューがあります。NSViewControllerを使用してそれらをウィンドウに追加し、ビューを設定しますが、ウィンドウはレスポンダーチェーンの最初にあり、次にNSWindowControllerです。例えば:1つのウィンドウと2つのViewControllerが同じビューを表示し、5つのテストフィールドが含まれている可能性があります。ViewController1はデータをロードしますが、データを編集することはできません。ViewController 2は同じビューを同じデータでロードしますが、有効にします。テキストフィールドの編集もそうです。ただし、すべてのアクションメソッドはWindowControllerに移動します。

于 2012-07-30T07:32:34.863 に答える
0

まず、App Delegate にはviewController既に定義済みというプロパティがあると思います。self.viewController = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];の代わりにこのコードを使用する必要がありTestController *controller = [[TestController alloc] initWithNibName:@"TestController" bundle:nil];ます。それで解決しない場合は、何が問題なのかわかりません。コードは、クリックしたボタンの属性を返す必要があります。私は独自のサンプル プロジェクトを作成し、コードをテストしました (ただし、私のアプリ デリゲートはあなたのものとは異なって見えました)。

次に、2 番目の質問 " " について詳しく説明する必要がありますWhy is this happening, and where is the correct mvc place to put IBActions for button methods (shouldn't controller classes handle these)?。あなたが何を意味するのかはあまり明確ではありません。

これが少し役立つことを願っています。

于 2012-06-02T04:19:10.867 に答える