NSMenuItem和裸esc密钥等价

时间:2010-07-14 12:57:03

标签: objective-c cocoa interface-builder

我正在尝试将一个简单的esc键按下绑定到一个切换全屏的NSMenuItem(目前只是一个存根函数)。手动选择菜单项会发送所需的IBAction。当我设置NSMenuItem的Key Equiv时。在Interface Builder中,键命令发送所需的IBAction的任意裸键(例如w)。当我设置Key Equiv时。命令+ esc,该键命令发送所需的IBAction。但是忽略了一个简单的esc键按下。

我假设esc键是特殊的。其他应用程序(例如Bannister的各种模拟器)能够实现这一点,任何想法如何?

3 个答案:

答案 0 :(得分:2)

我不是Objective-C的老手,如果我误解了这个问题,请道歉。但是你有没有试过提升响应者链并抓住NSWindow中的keyDown事件?类似的东西:

- (void)keyDown: (NSEvent *) event {
   if ([event keyCode] == 53) {
        NSLog(@"Esc. pressed");
     }
}

当然,这个解决方案需要你继承NSWindow。

答案 1 :(得分:1)

Escape键紧密绑定到cancelOperation的{​​{1}}类。

尝试继承NSResponder并为其提供此方法:

NSWindow

然后,您的窗口将对Escape键做出反应并唤起- (void)cancelOperation:(id)sender { if (![SomeController doSomeAction]) { [super cancelOperation:sender]; } } 。那将是你doSomeAction想要打电话的方法,但它拒绝这样做:)

NSMenuItem方法中,您应返回一个布尔值,指示该操作是否确实执行了某些操作。如果确实如此,那很好。如果没有(并返回doSomeAction),您的NO会将Escape键事件传递给链中的下一个响应者。

我喜欢这个解决方案,因为它可以为用户提供关于他的按键实际上是否有所作为的音频反馈。因为如果你的方法没有做任何事情,并且没有其他任何反对者做过任何事情,那么会发出一些“嘟嘟”的声音。

请注意,在没有附加窗口的NSWindow中,您可能必须使用NSView而不是[self nextResponder]

答案 2 :(得分:0)

请查看http://developer.apple.com/mac/library/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGUserInput/XHIGUserInput.html “...... Esc(Escape)键基本上意味着”让我离开这里。“它在某些情况下具有特定含义。用户可以在以下情况下按Esc:...“

问候