如果没有将WebView添加到窗口中,NSWindowController无法捕获ESC

时间:2013-04-05 12:12:50

标签: cocoa nswindowcontroller

我从File-> New创建了NSWindowController的子类,并选中了“With XIB for user interface”选项。所以我创建了3个新文件。然后我使用Interface Builder将一个视图添加到窗口中。

将此代码放在MyWindowController.m中:

- (void)keyDown:(NSEvent *)theEvent{
    NSLog(@"%@", theEvent);
}
  1. 首先测试,添加一个NSButton,然后运行该项目。
  2. 第二次测试,添加一个WebView(删除NSButton),然后运行项目。
  3. 在两个测试中,窗口都正确显示。但差异是:

    1. (NSButton)当我按下'a','b',...等键而不是ESC键时,我可以看到日志输出
    2. (WebView)当我按下'a','b',...,和ESC键等键时,我可以看到日志输出
    3. 我将NSButton更改为其他视图类型,以及我的自定义视图,所有操作都像第一种情况一样。

      我的气氛是:

      1. 为什么NSWindowController在第一种情况下无法捕获ESC键?
      2. 为什么NSWindowController以WebView作为第一响应者捕获ESC键。
      3. NSWindowController如何在没有WebView的情况下捕获ESC键?

3 个答案:

答案 0 :(得分:7)

请参阅NSResponder cancelOperation:文档:https://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html

  

此方法绑定到Escape和Command-。 (期间)钥匙。该   键窗口首先在视图层次结构中搜索其键的视图   相当于Escape或Command-。,无论输入哪个。如果没有   这些视图处理密钥等价物,窗口发送默认值   cancelOperation的动作消息:给第一响应者和来自   消息在响应者链中传播。如果没有响应者   响应者链实现了cancelOperation:,即关键窗口   在视图层次结构中搜索等效键为Escape的视图   (请注意,如果原始密钥等效,则可能是多余的   逃逸)。如果没有找到这样的响应者,则取消:动作消息   被发送到执行的响应者链中的第一个响应者   它

如果您想在NSWindowController子类中处理Esc键,只需在其中定义cancel:方法。

答案 1 :(得分:0)

好吧,我使用事件监视器捕获ESC按键,详见此处:http://www.ideawu.com/blog/post/54.html

但仍然没有得到WevView测试。

答案 2 :(得分:0)

我建议告诉窗口让第一响应者感兴趣的视图以便捕获关键事件

    [[self window]makeFirstResponder:_viewControllerOfInterest];