2017-07-16 25 views
0

SOに類似の質問がありますが、これにはひねりがあります。_statusItemがクリックされたときにNSMenuを使用してウィンドウをフォーカスしていないときにアクションを実行することはできません。

ユーザーがメニューバーにある自分のアプリアイコンをクリックしたときにアクションをトリガーする必要があります。

[_statusItem setTarget:self]; 
[_statusItem setAction:@selector(bringToFront:)]; 

が、これ_statusItemNSMenuがあります。アクションは、通常、私はこれを行うだろう前にそのウィンドウを持参、または他の言葉で、

[[[NSApplication sharedApplication] keyWindow] makeKeyAndOrderFront:self]; 

することです。

メニューを無効にすると、bringToFront:がトリガーされます。

だから、私はNSMenuDelegate方法menuWillOpenを実装します、と思いました。

- (void)menuWillOpen:(NSMenu *)menu { 
    [[[NSApplication sharedApplication] keyWindow] makeKeyAndOrderFront:self]; 
} 

しかし、問題があります。これは、アプリケーションウィンドウが選択されている場合は動作しますが、アプリが実行されていて、私がサファリを選択したとします。その後、私のアプリのウィンドウにはもう焦点がない、2000 Safariのウィンドウの後ろにある。今度は、メニューバーの自分のアプリのアイコンをクリックして、menuWillOpenはトリガーされません。

私はそれが仕事意味をなさない作るために集中するウィンドウをもたらすために持つ、メニューバー上のアプリのアイコンをクリックすることで、集中するウィンドウを持参してください。

+0

「NSApplication」通知は、あなたのアプリがアクティブステータスを取得/辞退するのに応じてポストされます。これに応じてあなたのステータス項目のメニューを有効/無効にしようとしましたか? – CRD

+0

どうすればいいですか? – SpaceDog

+0

何をしますか?通知の詳細については、 'NSApplication'のドキュメントを読んでください。 – CRD

答えて

1

NSApplication通知は、あなたのアプリがアクティブな状態を辞任/獲得に応じて掲載されています。これらの通知を処理し、ステータス項目のメニューを有効/無効にして、アプリがバックグラウンドにあるときにアクションが呼び出されるようにします。