3

私のCocoaアプリには、接続する必要のある2つのNIB/XIBファイルがあります。

  1. MainMenu.xib:NSApplicationデリゲートオブジェクトのカスタムオブジェクトが含まれ、NSApplicationプレースホルダーの適切なアウトレットに接続します。

  2. ContextMenu.xib:;を設定しNSMenuます。1つのエントリで設定ダイアログを開くことになっています

カスタムアプリデリゲートは、アプリIBActionの[設定]ウィンドウを表示するように定義します。

アプリケーションデリゲート(最初のNIB)で定義されたアクションに設定を表示するためにNSMenuItem(2番目のNIB)を接続するにはどうすればよいですか?

ドキュメントによると、これは簡単なはずですが、InterfaceBuilderでこれを正確に行う方法については言及されていません。

メニュー項目がアプリケーションレベルのコマンドを参照している場合は、そのコマンドをアプリケーションデリゲートに直接実装するか、デリゲートにアプリケーションの他の場所の適切なオブジェクトにメッセージを転送させることができます。

どういうわけか、2番目のNIBのアプリデリゲートにアクセスし、それが私のカスタムクラスであることをInterface Builderに伝え(カスタムIBActionを認識しているため)、メニュー項目のアクションに接続する必要があります。

ポインタをありがとう!

4

4 に答える 4

3

他のオブジェクトがレスポンダー チェーンにある場合は、アクションを最初のレスポンダーに接続するだけです。

ただし、「if」に注意してください。

Maurice Kelly が言及しているように、App Delegate はすでにレスポンダー チェーンの一部であるため、それを使用できます: (Interface Builder で) First Responder でカスタム アクションを定義し、App Delegate で対応するアクションを定義します。ただし、App Delegate を乱雑にする可能性のある多くのアクションがある場合は、このアーキテクチャを単純なアプリにのみ使用することをお勧めします。

于 2011-09-13T08:48:05.230 に答える
1

Application2 番目の NIB のバインディングの場合、アプリケーション デリゲート バインディングには、 で始まるモデル キー パスを使用して にバインディングすることでアクセスできますdelegate。すなわちdelegate.managedObjectContext

警告: 2 番目の NIB にアプリ デリゲート オブジェクトを作成しないでください。 その場合、2 番目の別個の managedObjectContext を持つ 2 番目のアプリ デリゲート インスタンスが作成されます。NIB は別のアプリ デリゲート オブジェクトを作成します。これはひどいです。

MainMenu.xib の読み込みで、MainMenu.xib で[NSApplication sharedApplication]インスタンス化されたデリゲート オブジェクトに設定されたデリゲートを取得します。別の NIB でデリゲート オブジェクトを作成すると、一致しないデリゲート オブジェクトが作成されます[NSApp delegate]。(そして、コンテキストのビューが更新されない理由を突き止めようとして、壁に頭をぶつけます)

于 2014-04-04T19:30:54.957 に答える
0

私は同じ問題を抱えており、次のように解決しました:

  • メニューを 1 つだけ作成しました (MainMenu.xib)。ファーストレスポンダーがアクションを提供しないメニュー項目は自動的にグレー表示されるため、[設定] ウィンドウがアクティブになると、ドキュメント ウィンドウ用の項目がグレー表示されます。

  • 設定ウィンドウの定義用に PrefsWin.xib を作成しました。その xib のファイルの所有者は、NSWindowController から継承する PrefsWinController という名前のクラスです。

  • MainMenu.xib のアクションは、デリゲートではなく、ファーストレスポンダーに接続するだけです。<NSApplicationDelegate> のインスタンスが NSResponder のインスタンスである場合、デリゲートは自動的にチェーン内の最後のレスポンダーとして機能します。(これがどこに文書化されているかはわかりませんが、私のプロジェクトでは確かに機能します。)

于 2013-07-28T09:47:34.963 に答える
0

2 番目の NIB には、アプリケーションによってインスタンス化されるクラスに設定する必要があるファイルの所有者があります。このクラス内で、アプリ デリゲートへの参照を作成できます。これは、クラスがインスタンス化されるときに入力できます (たとえばsetAppDelegate:self、デリゲート内から作成する場合は使用)。

このクラスで IBAction を作成します。この IBAction は、単純にアクションを App Delegate に渡します。

- (IBAction) passItOnAction:(id)sender {
    [appDelegate openPreferences:sender];
}
于 2011-09-13T08:19:19.707 に答える