2012-06-22 36 views
6

我想为NSMenuItem(在应用程序主菜单)中设置没有任何修饰符的等效键“”(空格)。NSMenuItem KeyEquivalent“”(space)bug

如从文件如下:

例如,在播放媒体的应用程序,播放命令可以被映射到仅仅是“”(空格),没有命令键。您可以使用以下代码执行此操作:

[menuItem setKeyEquivalent:@“”];

[menuItem setKeyEquivalentModifierMask:0];

Key Equivalent设置成功,但不起作用。当我按下“空格键”而没有修改键时,没有任何事情发生,但是当我按下“空格键”和“Fn”修饰键时,它是有效的。

我需要使用没有修饰符的“空格”。请任何帮助!

回答

3

我有同样的问题。我没有很努力地调查,但据我所知,空格键并不像“Cocoa”的键盘快捷键那样“看起来”,因此它被路由到-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,按照贾斯汀的回答,但到目前为止还没有得到那个工作。

因此,现在我已经放弃并将这一个IBAction重新定位到App Delegate,它在哪里工作。我不认为这是一个解决方案,只是做...可能这是一个错误,或者(更可能)我只是不明白事件消息和响应链。

1

上一篇文章,因为我也需要使用空间,但没有解决方案为我工作。

所以,I subclass NSApplication并与justin k solution使用sendEvent:选择:

- (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; 
    } 
} 

希望这将有助于