popUpStatusItemMenuを使用してNSStatusItemからNSMenuがポップしています。これらのNSMenuItemsはさまざまなリンクを表示し、それぞれがsetAction:によってターゲットのopenLink:メソッドに接続されます。この配置は長い間うまくいきました。ユーザがメニューからリンクを選択すると、openLink:メソッドがそのリンクを処理します。NSMenuItemのカスタムNSViewがマウスイベントを受け取りません
残念ながら、私は最近、NSMenuItemのsetView:メソッドを使用して実験を行い、より洗練された/滑らかなインターフェイスを提供することに決めました。基本的には、タイトルの設定をやめ、NSMenuItemを作成してから、setView:を使用してカスタムビューを表示しました。これは完璧に動作し、メニュー項目が大きく見え、私のカスタム表示が表示されます。
しかし、ユーザーがメニュー項目を選択してマウスを離すと、その動作は機能しなくなります(つまり、openLink:は呼び出されません)。単にsetView:callをコメントアウトするだけで、アクションは再び機能します(もちろん、メニュー項目は空白ですが、アクションは適切に実行されます)。私の最初の質問は、ビューを設定するとNSMenuItemのアクションが中断される理由です。
私のカスタムビューでmouseUpイベントを検出し、そこからアクションメソッドを呼び出すことで問題は解決します。この方法を私のカスタムビューに追加しました:
いいえサイコロ!このメソッドは決して呼び出されません。
私は追跡矩形を設定し、mouseEntered:eventsを受け取ることができます。次のように私は、私のmouseEnteredルーチンでいくつかのテストを置く:
not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow
これが問題である:
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"); }
とし、以下の回答を得ましたか。 "isKeyWindowではない"? Appleのドキュメントでは、「キーウィンドウにないビューをクリックすると、デフォルトでウィンドウが前面に移動してキーが作成されますが、マウスイベントは送出されません」という理由でこれはうまくいきません。しかし、これらのイベントを検出する方法が必要です。どうやって?
の追加:
[[self window] makeKeyWindow];
はcanBecomeKeyWindowがYESであるという事実にもかかわらず、何の効果もありません。
: http://openradar.appspot.com/7128269 があり主張回避策もあるが、私は、回避策の仕事をすることはできません。基本的には、canBecomeKeyを報告しても、ウィンドウはキーになることを拒否します。 – Dennis
こんにちは、私は同じ問題に直面しました。私はそれを解決するためにいくつかの方法を試してみましたが、私は一つの回避策を見つけましたが、ひどく醜いです。メニューステータスバーを表示した後、項目は強調表示されません。ステータス項目のメニューをnilに設定し、メニューポップアップを手動で制御しました。アプリケーションがアクティブな場合、私は単にメニューポップアップメソッドを呼び出す、私はアプリケーションのアクティブなメッセージを送信しないと、コールバックで私はメニューを開いている。ここにいくつかのコードがあります。再びひどく醜い。 http://gist.github.com/224275 – iafonov
私はiafonovのコードが素晴らしいと言わなければならない! 1年前!!!コードは無関係ですが。ありがとう! NSMenuItemのNSVIew、NSTextEditに関するすべての問題を解決します。最初は、NSTextEdit(NSMenuItem内)が正常に動作せず、キーの押下を受け取ることができず、マウスは変更されません。 acceptsFirstResponder、自己ウィンドウなし。makeFirstResponder:xxx、Just iafonov'code。それは重要なメニューをポップアップする方法です。 http://gist.github.com/224275 – user377808