2012-06-22 12 views
6

NSMenuItem(App Main Menu内)の修飾子を使用せずにキー相当の ""(スペース)を設定します。NSMenuItem KeyEquivalent ""(スペース)bug

ドキュメントから次のように:たとえば

、メディアを再生するアプリケーションでは、Playコマンドは、コマンドキーなしで、単に「」(スペース)にマッピングすることができます。次のコードでこれを行うことができます:

[menuItem setKeyEquivalent:@ ""];

[menuItem setKeyEquivalentModifierMask:0];

キー等価セットは正常に設定されましたが、動作しません。モディファイアなしで "Space"キーを押しても何も起こりませんが、 "Fn"修飾キーで "Space"を押すと動作します。

私は修飾語なしで "スペース"を使用する必要があります。助けてください!

答えて

3

私は同じ問題を抱えていました。私は非常に懸命に調査していませんが、私が言うことができる限り、スペースバーはココアのキーボードショートカットのように「見える」ので、-insertText:にルーティングされます。私のソリューションは、NSWindowのをサブクラスそれはレスポンダチェーンを(おそらくあなたの代わりにNSAppをサブクラス化する可能性が)上がると、それをキャッチして、明示的にメニューシステムにそれをオフに送信しました:

- (void)insertText:(id)insertString 
{ 
    if ([insertString isEqual:@" "]) { 
     NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
               location:[self mouseLocationOutsideOfEventStream] 
             modifierFlags:0 
              timestamp:[[NSProcessInfo processInfo] systemUptime] 
              windowNumber:self.windowNumber 
               context:[NSGraphicsContext currentContext] 
              characters:@" " 
          charactersIgnoringModifiers:@" " 
              isARepeat:NO 
               keyCode:49]; 
     [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
    } else { 
     [super insertText:insertString]; 
    } 
} 
+0

感謝を助けることを願っていますが) – Kira

1

私はちょうど同じことを経験してきましたひねりの問題。

NSMenuItemのリンクされたIBActionがApp Delegateにある間に、スペースバーのキー同等物がアプリケーションでうまく動作します。

IBActionを専用コントローラに移動すると失敗します。他のすべてのメニュー項目キーは機能し続けますが、スペースバーは反応しません(修飾キーでは問題ありませんが、未修正@ ""は機能しません)。

レスポンダチェーン経由でのリンクとコントローラへの直接リンクのような、さまざまな回避策を試してみましたが、役に立たないものです。私は、コードの方法を試してみました:

[menuItem setKeyEquivalent:@" "]; 
[menuItem setKeyEquivalentModifierMask:0]; 

とInterface Builderの道、動作は同じ

である私はジャスティンの答えに従って、NSWindowのをサブクラス化しようとしているが、これまでの仕事にそれを得るために失敗しています。

今のところ、私はこの1つのIBActionをApp Delegateに委譲し、それが動作する場所に移しました。私はこれを解決策と見なしていません。ちょうどやってみましょう。おそらくバグかもしれません。あるいは、私はイベントメッセージやレスポンダーチェーンについてよく理解していません。

1

私はスペースを使用する必要があるので、この記事をアップしてください。

ので、I subclass NSApplicationjustin k solutionsendEvent:セレクタを使用します。

- (void)sendEvent:(NSEvent *)anEvent 
{ 
    [super sendEvent:anEvent]; 
    switch ([anEvent type]) { 
    case NSKeyDown: 
     if (([anEvent keyCode] == 49) && (![anEvent isARepeat])) { 

      NSPoint pt; pt.x = pt.y = 0; 
      NSEvent *fakeEvent = [NSEvent keyEventWithType:NSKeyDown 
                location:pt 
              modifierFlags:0 
               timestamp:[[NSProcessInfo processInfo] systemUptime] 
               windowNumber: 0 // self.windowNumber 
                context:[NSGraphicsContext currentContext] 
               characters:@" " 
           charactersIgnoringModifiers:@" " 
               isARepeat:NO 
                keyCode:49]; 
      [[NSApp mainMenu] performKeyEquivalent:fakeEvent]; 
     } 
     break; 

    default: 
     break; 
    } 
} 

が、それは動作しますが、それはあなたが答えるため