1

メインウィンドウ(アプリデリゲート)で有効にする必要があるメニュー項目「foobar」がありますが、他のすべてのウィンドウでは無効にします。ファーストレスポンダーのビジネスは私にとって非常に混乱しているので、その方法を知りたいです. これが私が今持っているものです:

  • 「foobar」アイテムは、MainMenu.xib のファーストレスポンダーの「foobar:」カスタム アクションに接続されます。
  • メインアプリデリゲートに「foobar:」アクションがあるため、メニュー項目が有効になり、機能します
  • 今、別のウィンドウをロードして「makeKeyAndOrderFront」
  • 私はその新しいウィンドウにいくつかのコントロールを集中させます
  • これは私の「foobar」アイテムを無効にする場所ですが、そうではありません

「validateMenuItem」がアプリ デリゲートで呼び出されていることがわかりますが、2 番目のウィンドウのコントローラーでは呼び出されていません。

なぜこれが起こっているのか、これを解決するためにどのようなオプションが必要なのか、非常に簡単な言葉で説明してもらえますか?

ご感想ありがとうございます

4

1 に答える 1

1

アプリデリゲートをメインウィンドウのデリゲートとして設定し、次のメソッドを実装します。

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    [foobar setEnabled: YES];
}

- (void)windowDidResignKey:(NSNotification *)notification
{
    [foobar setEnabled: NO];
}

ファーストレスポンダーについて

最初のレスポンダーは、ウィンドウ内にあるNSControlです。たとえば、特定のウィンドウには、textField1とtextField2の2つのテキストフィールドがあります。入力すると、最初のレスポンダー(最初のレスポンダーを受け入れるすべてのコントロールの1つ)にのみ入力されます。 )したがって、必要なのは、どのウィンドウが重要であるかを知ることです。特定のケースで誰が最初の応答者であるかを知る必要はありません。

編集

別の方法もあります(おそらくより高速ですが、個人的な好みによって異なります):インターフェイスビルダーを使用して、特定のウィンドウがキーである場合にのみ有効にするメニュー項目を選択します。このウィンドウがのivarであると仮定しましょう。 window1という名前のアプリデリゲート。次に、そのメニュー項目をクリックし、バインディングインスペクターに移動し、[有効]で[バインド先]を選択します:アプリデリゲート、モデルキーパス:self.window.isKeyWindow。

ちょっとした画像のヒント:

ここに画像の説明を入力してください

于 2012-12-20T17:27:22.207 に答える