アプリケーション メニューの項目が に接続されたドキュメント ベースの cocoa アプリケーションがありますIBAction
。項目をクリックすると、IBOutlet
別のクラスを使用しているメインの nib ファイルで を使用するタスクを実行する必要がありますMyDocument
。同じクラスの 2 つのオブジェクトを作成すると、各 nib に 1 つが機能していないようです。アウトレットへのアクセス方法を教えてください。
3 に答える
メニュー項目のアクションは、多くの場合、現在選択されているものに基づいて動作できるようにファーストレスポンダに送信されます。
このアクションは現在のドキュメントで機能するもののように思えますが、ドキュメントによって実装する必要があります。この場合、メニューのアクションを最初の応答者に送信し、アクション メソッドを MyDocument クラスに配置します。
送信しようとしているアクションがカスタムのものである場合: メイン メニュー nib で First Responder 項目を選択し、メソッド名を追加してから、メニュー項目のセレクターをアクションに接続します。
詳細については、 Cocoa イベント処理ガイドのレスポンダーのセクションを参照してください。
上記を要約すると、NIB / XIBファイルで、Interface Builderで、ファイル所有者やその他のものではなく、FirstResponderオブジェクトに接続します。それでも、潜在的なファーストレスポンダー全体で一連のアクションが提供されます。
次に、Cocoaはそのセレクターを取得し、現在最初のレスポンダーであるNSView(存在する場合)、現在使用中のNSDocument、ウィンドウコントローラーなどからアプリケーションデリゲートまでを探します。そのメソッドを実際に実装することをチェックする最初のオブジェクトは、そのオブジェクトを使用します(同じオブジェクトで検証した後)。
それで:
@interface MyDocumentTypeA : NSDocument {
}
-(void)myMenuAction:(id)sender;
-
@interface MyDocumntTypeB : NSDocument {
}
// -myMenuAction: not implemented here
-
@interface MyApplicationDelegate ... {
}
-(void)myMenuAction:(id)sender;
-
Interface Builderで(またはプログラムで)、メニュー項目の「アクション」をファーストレスポンダーの「myMenuAction:」という名前のセレクターにリンクした場合(プログラムで実行した場合はターゲットを指定しないことと同じです)、上記の場合次の2つのドキュメントサブクラスが発生します。
MyDocumentTypeAの場合、ユーザーがそのメニュー項目を選択すると、MyDocumentTypeAの-myMenuAction:が呼び出されます。MyDocumentTypeBはこのアクションを実装しないため、Cocoaは、それを実装するアプリケーションデリゲートに到達するまでレスポンダーチェーンを検索し続けます。そのため、代わりにここで呼び出されます。
Cocoaがメソッドを実装するレスポンダーチェーン内のオブジェクトを検出しない場合、メニュー項目は無効のままになります。
これを行う方法があります。同様のスレッドに回答を投稿しました: Access IBOutlet from other class (ObjC)