2011-02-07 16 views
3

NSViewNSMenuItemに設定して、独自の描画とレンダリングを行いました。しかし、NSMenuItemに割り当てられた 'keyEquivalent'は応答していないようです。私は描画とアクションハンドリングが自己処理される必要があることを理解していますが、私が何をしていてもkeyEquivalentリクエストをキャプチャできないようです。 NSApplicationのsendEventをサブクラス化しようとしましたが、アプリケーションがNSStatusBarItem(LSUIElement)であり、NSEventTrackingRunLoopMode(メニューがダウンしている)のイベントがNSApplicationのsendEventに届かないため動作しません。NSMenuItemカスタムビューがkeyEquivalentに応答しません

それから私は使用して試してみた:これは私は、コントローラに、メインメニューのデリゲートを設定したにも関わらず呼び出されることはありませんよう

- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event target:(id *)target action:(SEL *)action 

これはどちらか動作しません。

誰でもカスタムビューを使用しているときにNSMenuItemsで 'keyEquivalent'イベントをキャプチャする方法はありますか?

ありがとうございます!

+0

このドキュメントでは、「キーボードの同等物とタイプ選択は、通常と同じようにキーの等価とタイトルを使用し続けます」と述べる必要があります。しかし、これは真実ではないようです。 – strange

答えて

1

私はこれは古い投稿で、これはおそらくこれ以前は長いことを知っていますが、同じ問題を抱えていて、解決策を見つけようと何回もあなたの投稿に遭遇したので、

NSApplicationをサブクラス化してsendEventをオーバーライドすることで、この問題を回避することができました。あなたは成功しなかったのでこれを試してきたとおっしゃったので、違いは分かりませんが、NSStatusBarItemのNSMenuからイベントを傍受するのに問題はありませんでした。キーの同等性はすべてintであるため、キーを検証し、適切な項目を見つけて、NSMenuItemアクションを明示的に呼び出します。

-(void)sendEvent:(NSEvent *)theEvent 
{ 
    if([theEvent type] == NSKeyUp){ 
     NSInteger mod = ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask); 

     if(mod == NSCommandKeyMask) { 
      NSInteger keyEquiv = [[theEvent characters] isEqualToString:@"0"] 
      ? 10 
      : [[theEvent characters] integerValue]; 
      if(keyEquiv > 0) { 
       NSMenuItem *item = [[(MyAppDelegate *)[self delegate] myStatusMenu] itemAtIndex:(keyEquiv - 1)]; 
       if([[item keyEquivalent] integerValue] == keyEquiv){ 
        [[item target] performSelector:[item action] withObject:item]; 
       } 
      } 
     } 
    } 
    [super sendEvent:theEvent]; 
} 
+0

ええと...うまくいくかもしれませんが、NSApplicationをサブクラス化しなければならないということは私には間違いないと思います。それはCocoaとAppKitがどのように設計されたか、動作するはずのものではありません。 – Jay

+0

@Jay、私は同じことをする必要があり、Cruttの答えはそれを達成する唯一の方法だと思われます。それを実装するために私のコード外の設定を微調整する必要があるよりも、私はもう喜んでいません。とにかく、関連するメモ:http://stackoverflow.com/questions/27144113/subclass-nsapplication-in-swift – Charlesism

関連する問題