popUpStatusItemMenu を使用して NSStatusItem から NSMenu が飛び出しています。これらの NSMenuItem は一連の異なるリンクを示しており、それぞれが setAction: でターゲットの openLink: メソッドに接続されています。この配置は長い間うまく機能しています。ユーザーがメニューからリンクを選択すると、openLink: メソッドがそれを処理します。
残念ながら、私は最近、NSMenuItem の setView: メソッドを使用して、より洗練されたインターフェースを提供する実験を行うことにしました。基本的に、タイトルの設定をやめ、NSMenuItem を作成し、setView: を使用してカスタム ビューを表示しました。これは完全に機能し、メニュー項目は見栄えがよく、カスタム ビューが表示されます。
ただし、ユーザーがメニュー項目を選択してマウスを放すと、アクションは機能しなくなります (つまり、openLink: は呼び出されません)。setView: 呼び出しを単純にコメントアウトすると、アクションが再び機能します (もちろん、メニュー項目は空白ですが、アクションは適切に実行されます)。私の最初の質問は、ビューを設定すると NSMenuItem のアクションが中断される理由です。
問題ありません。カスタム ビューで mouseUp イベントを検出し、そこからアクション メソッドを呼び出すことで修正できると思いました。このメソッドをカスタム ビューに追加しました。
- (void)mouseUp:(NSEvent *)theEvent {
NSLog(@"in mouseUp");
}
ダイスなし!このメソッドは呼び出されません。
ただし、トラッキング rect を設定して mouseEntered: イベントを受け取ることはできます。次のように、mouseEntered ルーチンにいくつかのテストを入れました。
if ([[self window] ignoresMouseEvents]) { NSLog(@"ignoring mouse events"); }
else { NSLog(@"not ignoring mouse events"); }
if ([[self window] canBecomeKeyWindow]) { dNSLog((@"canBecomeKeyWindow")); }
else { NSLog(@"not canBecomeKeyWindow"); }
if ([[self window] isKeyWindow]) { dNSLog((@"isKeyWindow")); }
else { NSLog(@"not isKeyWindow"); }
そして、以下の回答を得ました。
not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow
これが問題ですか?「isKeyWindow ではない」? Apple のドキュメントには、「ユーザーがキー ウィンドウにないビューをクリックすると、デフォルトでウィンドウが前面に表示されてキーになりますが、マウス イベントはディスパッチされません」と記載されているため、おそらくこれは適切ではありません。しかし、これらのイベントを検出する方法が必要です。どうやって?
追加:
[[self window] makeKeyWindow];
canBecomeKeyWindow が YES であるにもかかわらず、効果はありません。