7

そのため、CocoaDevをチェックし、NSMenuItemsのCocoaドキュメントを読み、InterfaceBuilderでいくつかのテストを行うことに時間を費やしました。

私のアプリケーションには、Interface Builderで設計されたアプリケーションメニュー([NSApp mainMenu])があります。私は3つの潜在的な道を見る:

  1. アクションレスポンダーをNSApplicationDelegateに配置します。これは私には奇妙に思えます。これは、食物連鎖のはるか上にあることもあり、ボルトで固定されているように見えることもあります。

  2. さまざまなNSMenuItemアクションメッセージをリッスンするサブビューを作成します。これは便利に思えますが、レスポンダーチェーンに含めるために、私が理解できなかった魔法があるかもしれません。

  3. 特定のアプリケーションメニューをリッスンするNSObjectを作成し、それをxibに配置して、接続します。これは、現時点で最善の解決策のように思われます。なぜなら、特定のオブジェクトに到達するためにレスポンダーチェーンに依存することなく、ものを分離できるからです。しかし、アプリを十分なレベルの複雑さにすると、これはレスポンダーチェーンを破壊するため、問題になる可能性があるのではないかと思います。これは、おそらく使いやすさを超えた理由で存在します。

長い質問でごめんなさい。望ましいアプローチはありますか?ありがとう!

4

2 に答える 2

7

それは本当にあなたのアプリケーションのアーキテクチャに依存します。原則として、意味のある場所にアクションを実装します。アクションメッセージのレスポンダーチェーンは、その点で役立ちます。

アプリケーションがドキュメントベースでない場合、アクションメッセージのレスポンダーチェーンは次のようになります。

  1. どちらのレスポンダーが最初のレスポンダーであるか
  2. 階層を表示
  3. ウィンドウコントローラー
  4. ウィンドウデリゲート
  5. NSApp
  6. アプリケーションデリゲート

アプリケーション全体に対して本当にグローバルである場合にのみ、アプリケーションデリゲートでアクションを使用します。それ以外の場合は、特定のウィンドウで意味がある場合はウィンドウコントローラー(通常はウィンドウデリゲートでもあります)に配置し、特定のビューで意味がある場合はビューコントローラーに配置します。

ビューコントローラー(のサブクラスNSViewController)はレスポンダーチェーンに自動的に挿入されないことに注意してください。対応するビューをスーパービューに追加した後、手動でこれを行います。たとえば、NSViewControllerサブクラスでは次のようになります。

NSResponder *nextResponder = [[self view] nextResponder];
[[self view] setNextResponder:self];
[self setNextResponder:nextResponder];

これにより、ビューと元のビューの次のレスポンダーの間のレスポンダーチェーンにself(のサブクラスのインスタンス)が挿入されます。NSViewController

3番目のアプローチ、つまりアクションメッセージ(のサブセット)に特定のターゲットを設定することには、本質的に問題はないことに注意してください。一部のアクションはコンテキストに依存する可能性があるため、レスポンダーチェーンは、さまざまなオブジェクトがアクションメッセージを処理する機会を与えるために存在します。たとえば、[ファイル]メニューのアクションは通常、現在メインウィンドウであるウィンドウに適用されるため、特定のターゲットを持たず、代わりにレスポンダーチェーンを使用するのが理にかなっています。一方、ApplicationNameメニューのアクションは真にグローバルであり、レスポンダーチェーンを経由する必要がないため、特定のターゲットに接続できます。

于 2011-05-06T22:02:10.337 に答える
0

私は通常IBActions、アプリコントローラー(NSAppデリゲート)で公開し、メニュー項目をそれらのアクションに接続します。これは物事を行うためのかなり標準的な方法です。メニュー項目がたくさんある場合は、機能をアプリコントローラーに接続されている1つ以上のコントローラーに分割し、メニュー項目をそれらに接続することもできます。

于 2011-05-06T21:26:43.043 に答える