4

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

并在 MyWindowController.m 中有此代码:

- (void)keyDown:(NSEvent *)theEvent{
    NSLog(@"%@", theEvent);
}
  1. 首先测试,添加一个 NSButton,然后运行项目。
  2. 第二次测试,添加一个WebView(NSButton已删除),然后运行项目。

在这两个测试中,窗口都正确显示。但不同的是:

  1. (NSButton)当我按下“a”、“b”、...等键时,我可以看到日志输出,但不能看到 ESC 键
  2. (WebView)当我按下“a”、“b”、...等键以及 ESC 键时,我可以看到日志输出

我将 NSButton 更改为其他视图类型,以及我的自定义视图,都像第一种情况一样。

我的问题是:

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

3 回答 3

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 的视图(请注意,如果原始等效键为 Escape,则这可能是多余的)。如果没有找到这样的响应者,则将取消:操作消息发送到实现它的响应者链中的第一个响应者。

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

于 2013-04-06T20:52:27.620 回答
0

好吧,我使用事件监视器来捕获 ESC 按键,在此处查看详细信息:http ://www.ideawu.com/blog/post/54.html

但仍然没有得到 WevView 测试。

于 2013-04-06T09:16:42.950 回答
0

我建议告诉窗口将感兴趣的视图作为第一响应者,以捕捉关键事件

    [[self window]makeFirstResponder:_viewControllerOfInterest];
于 2016-06-20T00:22:30.920 回答