Cocoa 为什么密钥等效项与escape一起工作,而与return不一起工作?

Cocoa 为什么密钥等效项与escape一起工作,而与return不一起工作?,cocoa,nsbutton,Cocoa,Nsbutton,我的窗口上有一个按钮,它在interface builder中设置为具有与enter等效的键,但在将内容视图从使用IKImageBrowserView切换到NSCollectionView后,将忽略等效的键 根据文档中的内容: keyEquivalent事件是“特殊”处理的,应该非常直接 我正在对NSCollectionViewItem和该项的视图进行子类化,但是当我重写该方法时,这两个子类都没有获得相同的性能:事件 默认按钮旁边有一个cancel按钮,该按钮映射到esacpe密钥。取消继续工

我的窗口上有一个按钮,它在interface builder中设置为具有与enter等效的键,但在将内容视图从使用IKImageBrowserView切换到NSCollectionView后,将忽略等效的键

根据文档中的内容:

keyEquivalent事件是“特殊”处理的,应该非常直接

我正在对NSCollectionViewItem和该项的视图进行子类化,但是当我重写该方法时,这两个子类都没有获得相同的性能:事件

默认按钮旁边有一个cancel按钮,该按钮映射到esacpe密钥。取消继续工作,但默认按钮不起作用

我如何知道在哪里处理enter键事件

编辑:

实际上,我在示例应用程序中发现了与我用来了解NSCollectionView相同的问题。我在窗口底部添加了一个默认按钮,发现return没有触发按钮,但enter(fn+return)触发了按钮

在本例中,您知道什么是窃取返回键事件吗

编辑:


我在这里发布了一个示例项目:。为什么默认按钮不起作用?

Return
Enter
是两个不同的键
Return
(在美国键盘上)位于撇号键的右侧
Enter
是键盘右下角的键。如果您使用的笔记本电脑没有数字键盘,则按
fn
+
Return
可获得
Enter


发布示例代码后编辑

MyCollectionView
正在吸收返回/输入键,而不是将其传递给响应程序链。将此添加到MyCollectionView的实现中,返回并按enter键:

- (void)keyDown:(NSEvent *)theEvent {
//  NSLog(@"event: %@", theEvent);
    if (36 == theEvent.keyCode || 76 == theEvent.keyCode) {
        //pass return and enter up the responder chain
        [[self window] keyDown:theEvent];
    }
    else {
        //process all other keys in the default manner
        [super keyDown:theEvent];
    }
}

如果您需要MyControllerView使用return/enter实际执行某些操作,这可能会导致问题。在这种情况下,您可以将
[super keyDown:theEvent]
添加到
[[self window]keyDown:theEvent]
之前

返回
输入
是两个不同的键
Return
(在美国键盘上)位于撇号键的右侧
Enter
是键盘右下角的键。如果您使用的笔记本电脑没有数字键盘,则按
fn
+
Return
可获得
Enter


发布示例代码后编辑

MyCollectionView
正在吸收返回/输入键,而不是将其传递给响应程序链。将此添加到MyCollectionView的实现中,返回并按enter键:

- (void)keyDown:(NSEvent *)theEvent {
//  NSLog(@"event: %@", theEvent);
    if (36 == theEvent.keyCode || 76 == theEvent.keyCode) {
        //pass return and enter up the responder chain
        [[self window] keyDown:theEvent];
    }
    else {
        //process all other keys in the default manner
        [super keyDown:theEvent];
    }
}

如果您需要MyControllerView使用return/enter实际执行某些操作,这可能会导致问题。在这种情况下,您可以将
[super keyDown:theEvent]
添加到
[[self window]keyDown:theEvent]
之前。谢谢,我正在使用IB设置密钥等效项,因此我认为这不是问题所在。但是很高兴知道。如果按钮变为蓝色,这不意味着它需要一个等价的返回键吗?按钮是蓝色的,但你是对的,enter是触发它的。我一定错过了什么,因为这对我来说毫无意义。感谢您的帮助。我还尝试用setKeyEquivalent:@“\r”在代码中处理此问题,结果相同。Enter有响应,但return没有。在某些情况下,return可以工作,但通常Enter是按默认按钮的键。(当然,我刚刚在Safari的“另存为…”对话框中测试了这一点,返回成功。)你说得对。说
setKeyEquivalent:@“\r”
应该可以。窗口中有文本字段吗?我认为他们可以在返回到达按钮之前拦截它。谢谢,我使用IB设置密钥等价物,所以我认为这不是问题所在。但是很高兴知道。如果按钮变为蓝色,这不意味着它需要一个等价的返回键吗?按钮是蓝色的,但你是对的,enter是触发它的。我一定错过了什么,因为这对我来说毫无意义。感谢您的帮助。我还尝试用setKeyEquivalent:@“\r”在代码中处理此问题,结果相同。Enter有响应,但return没有。在某些情况下,return可以工作,但通常Enter是按默认按钮的键。(当然,我刚刚在Safari的“另存为…”对话框中测试了这一点,返回成功。)你说得对。说
setKeyEquivalent:@“\r”
应该可以。窗口中有文本字段吗?我想他们可以在返回到按钮前拦截它。我正在运行IconCollection。我在任何地方都没有看到默认按钮。是否有我丢失的窗口?我必须自己添加默认按钮。只是在集合视图的正下方为它腾出了空间。实际上,我用一个新项目复制了这个问题,该项目有一个空的集合视图(必须是可选的)和一个默认按钮。看起来不太好。我修改了我的答案,以显示如何让return/enter与您的示例程序一起工作。我正在运行IconCollection。我在任何地方都没有看到默认按钮。是否有我丢失的窗口?我必须自己添加默认按钮。只是在集合视图的正下方为它腾出了空间。实际上,我用一个新项目复制了这个问题,该项目有一个空的集合视图(必须是可选的)和一个默认按钮。看起来不太好。我修改了我的答案,以展示如何让return/enter与您的示例程序一起工作。