为什么密钥等效工作与逃避但不与返回?

时间:2011-09-23 16:42:41

标签: cocoa nsbutton

我的窗口上有一个按钮,它在界面构建器中设置为具有等效于Enter的键,但在将内容视图从使用IKImageBrowserView切换到NSCollectionView之后,keyEquivalent被忽略。

根据文档中的说法: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3-SW10

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

我正在继承NSCollectionViewItem和项目的视图,但是当我覆盖该方法时,这些子类都没有获得performKeyEquivalent:theEvent。

默认按钮旁边有一个取消按钮,并被映射到esacpe键。取消继续有效,但默认按钮不起作用。

如何判断输入键事件的处理位置?

编辑:

我实际上在以前学习NSCollectionView的示例应用程序中发现了同样的问题。我在窗口底部添加了一个默认按钮,发现返回没有触发按钮,但输入(fn + return)确实触发了按钮。

IconCollection sample app from Apple

关于在这个例子中窃取返回键事件的任何想法?

编辑:

我在这里发布了一个示例项目:https://github.com/watkyn/NSCollectionViewIssue。为什么默认按钮不起作用?

1 个答案:

答案 0 :(得分:3)

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


在发布示例代码后进行编辑

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

- (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以返回/输入实际执行某些操作,这可能会导致问题。在这种情况下,您可以在[super keyDown:theEvent]之前添加[[self window] keyDown:theEvent]