2009-09-08 11 views
7

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であるという事実にもかかわらず、何の効果もありません。

+0

: http://openradar.appspot.com/7128269 があり主張回避策もあるが、私は、回避策の仕事をすることはできません。基本的には、canBecomeKeyを報告しても、ウィンドウはキーになることを拒否します。 – Dennis

+0

こんにちは、私は同じ問題に直面しました。私はそれを解決するためにいくつかの方法を試してみましたが、私は一つの回避策を見つけましたが、ひどく醜いです。メニューステータスバーを表示した後、項目は強調表示されません。ステータス項目のメニューをnilに設定し、メニューポップアップを手動で制御しました。アプリケーションがアクティブな場合、私は単にメニューポップアップメソッドを呼び出す、私はアプリケーションのアクティブなメッセージを送信しないと、コールバックで私はメニューを開いている。ここにいくつかのコードがあります。再びひどく醜い。 http://gist.github.com/224275 – iafonov

+0

私はiafonovのコードが素晴らしいと言わなければならない! 1年前!!!コードは無関係ですが。ありがとう! NSMenuItemのNSVIew、NSTextEditに関するすべての問題を解決します。最初は、NSTextEdit(NSMenuItem内)が正常に動作せず、キーの押下を受け取ることができず、マウスは変更されません。 acceptsFirstResponder、自己ウィンドウなし。makeFirstResponder:xxx、Just iafonov'code。それは重要なメニューをポップアップする方法です。 http://gist.github.com/224275 – user377808

答えて

9

カスタムビューにこれを追加し、あなたは問題ないはずです。

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent 
{ 
    return YES; 
} 
+1

働いて、ありがとう! – Vojto

4

私は私のカスタムビューに、このメソッドを追加した、と今ではすべてが美しく動作します:

- (void)viewDidMoveToWindow { 
    [[self window] becomeKeyWindow]; 
} 

・ホープ、このことができます!

12

カスタムNSViewのにこのメソッドを追加し、それがマウスイベント

- (void)mouseUp:(NSEvent*) event { 
    NSMenuItem* mitem = [self enclosingMenuItem]; 
    NSMenu* m = [mitem menu]; 
    [m cancelTracking]; 
    [m performActionForItemAtIndex: [m indexOfItem: mitem]]; 
} 

で正常に動作しますが、私はあなたがこの問題を解決した場合多分あなたは私の質問に行くと私を助けることができる、keyhandlingに問題を抱えています若干。

+0

これは私のための解決策でした!ありがとう! – kdbdallas

+0

うわー、私はこれを理解しようと半日も過ごしました。ありがとう – Cory

-1

最近、NSStatusItemのカスタムビューを表示し、NSMenuをクリックしてステータスアイコンのドラッグアンドドロップ操作をサポートするように表示する必要がありました。

私は、主に、this質問にある3つの異なるソースを使用して私の問題を解決しました。

他人に役立つことを願っています。

-1

AppleのサンプルコードCustomMenus を参照してください。そこには、ImagePickerMenuItemViewクラスの良い例があります。

通常のNSMenuItemのようにメニューを表示するのは簡単ではありません。 本当の決定とコーディングがあります。オープンレーダーでこの問題に関する詳細情報はあり

関連する問題