8

ドックアイテムもキーウィンドウもメインメニューもないメニューバーにのみ配置されるMacアプリを作成しています(LSUIElementinfo.plistに設定されていますYES)。私が最初にアプリを起動したときapplicationDidBecomeActive:、私が期待するように、が呼び出されます。ただし、別のアプリがフォーカスを取得すると、applicationDidBecomeActive:再び呼び出されることはありません。

これにより、アプリ内にあるテキストフィールドがファーストレスポンダーになるのを防ぎます。アプリを最初に開いたとき、テキストフィールドは編集可能です。

別のアプリがフォーカスを得る前に

ただし、別のアプリが前面に表示された後は、テキストフィールドを編集できません。

別のアプリがフォーカスを獲得した後

私が試したこと:

メニューが開かれると、のデリゲートmenuWillOpen:で呼び出されます。NSMenu私は次のものを配置しようとしましたが成功しませんでした:

[NSApp unhide];
[NSApp arrangeInFront:self];
[NSApp activateIgnoringOtherApps:YES];
[NSApp requestUserAttention:NSCriticalRequest];
[[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
[[NSRunningApplication currentApplication] unhide];

この問題はおそらく、前面に表示するウィンドウがないことに関連していると思います。ここでストローを握っているような気がします。どんな助けでも大歓迎です。

4

3 に答える 3

3

問題は、aが開いているときにrunloopがどのように動作するかということだと思うNSMenuので、メニューを表示する前にアプリをアクティブ化してみてください。表示している場合は、次のNSStatusItemように自分で行うことをお勧めします。

- (void)toggleMenu:(id)sender
{
  // App might already be active
  if ([NSApp isActive]) {
    [self.statusItem popUpStatusItemMenu:self.menu];
  } else {
    [NSApp activateIgnoringOtherApps:YES];
  }
}

- (void)applicationDidBecomeActive:(NSNotification *)notification
{
  [self.statusItem popUpStatusItemMenu:self.menu];
}

それはうまくいくはずですが、一般的にはメニューの代わりに実際のウィンドウを使用した方が幸運だと思います。

于 2013-02-28T16:37:05.320 に答える
1

-makeFirstResponder:窓口で電話してみてください。NSWindow は通常、NSResponder チェーンの開始点です。

- (void)menuWillOpen:(NSMenu *)menu {
    [[NSApp mainWindow] makeFirstResponder:yourTextInputField];
}

あなたのアプリはファーストレスポンダーとして最初に起動すると言ったので、あなたのテキストフィールドはすでにファーストレスポンダーを受け入れていると思います。そうでない場合は、テキスト フィールドがオーバーライド-acceptsFirstResponder:されて返されることを確認してください。YES

- (BOOL)acceptsFirstResponder {
    return YES;
}

編集: ああ、キー ウィンドウがないことがわかります。NSMenu には実際にウィンドウが関連付けられているようですが、呼び出しても安全-makeFirstResponder:です。ここでの議論で-viewDidMoveToWindow:は、NSMenu のテキスト フィールドを含むビューを次のようにオーバーライドすることを提案しています。

- (void)viewDidMoveToWindow {
    [super viewDidMoveToWindow];

    [[self window] makeFirstResponder:yourTextInputField];
}
于 2013-02-28T09:19:24.380 に答える
1

-becomeFirstResponderおそらくオーバーライド-canBecomeFirstResponderするか、become メソッドを自分で呼び出すことにより、への入力を許可する必要があります。

テキスト入力を格納しているビューに対してこれらのメソッドを実装/呼び出す必要があるか、入力ビューにファーストレスポンダーになるように指示する必要があります。

いずれにせよ、レスポンダー チェーンの問題のようなにおいがします。

于 2013-02-28T03:51:46.133 に答える