2011-08-20 13 views
5

すべて、 私はNSBoxのサブクラスを持ち、ラベルと2つのimageViewsのようなサブビューを持っています。私はmenuForEvent:をオーバーライドしました。しかし、NSBoxをクリックして選択し、後でそのサブビューのControl + Clickをクリックすると、menuForEvent:は呼び出されません。Control + Click not trigger menuForEvent

私はそのような場合がわかりません。

+0

私はテーブルの中で同じものを持っています...私は何を見つけるかを教えてくれます。 –

答えて

1

あなたがmenuForEventを実装する必要があります。サブビューでは、あまりにも、そしてあなたのスーパーの(NSBoxサブクラス)にイベントを転送menuForEventの実装を:

- (NSMenu *)menuForEvent:(NSEvent *)event 
{ 
    return [[self superview] menuForEvent:event]; 
} 
私はそれが自動的にせずにスーパーに通って落下すると仮定

サブビューをサブクラス化する必要があります。私は右クリックがあるが、何らかの理由でコントロールをクリックしていないことがわかった。

+0

これは実際問題を痛みなく解決します、ありがとう! – duncanwilcox

4

コントロールのクリックと右クリックが(jfewtrが指摘したように)NSViewによってどのように処理されるかに違いがあります。 のコンテキストメニューが表示されます。を右クリックします。クリックがサブビュー内にある場合はの場合はをクリックします。私はこのことに驚き、実際にここでは詳細にそれについての記事を書いた

NSView control-click quirks

ありカップル潜在的な解決策がありますが、あなたの全体のサブビューツリーをカスタマイズ/オーバーライドすることは、おそらく最良の選択ではありません。それは、それはこの動作をハードコードする素晴らしいませんが

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    if (theEvent.modifierFlags & NSControlKeyMask) 
    { 
     [NSMenu popUpContextMenu:[self menuForEvent:theEvent] withEvent:theEvent forView:self]; 
    } 
} 

:このための最良の修正がコントロールクリックのためのあなたのトップレベルのビュー(あなたNSBoxサブクラス)で明示的にあなたのコンテキストメニューを表示することです、私を見つけましたサブビューツリー全体の操作やトラバースを回避し、より問題の多い副作用/バグが発生する可能性があります。