Cocoa NSWindowController可以';将不带WebView的捕获ESC添加到窗口中

Cocoa NSWindowController可以';将不带WebView的捕获ESC添加到窗口中,cocoa,nswindowcontroller,Cocoa,Nswindowcontroller,我从File->New创建了NSWindowController的子类,并选中了“with XIB for user interface”选项。所以我创建了3个新文件。然后我使用Interface Builder将一个视图添加到窗口中 并在MyWindowController.m中包含以下代码: - (void)keyDown:(NSEvent *)theEvent{ NSLog(@"%@", theEvent); } 首先测试,添加一个NSButton,然后运行项目 第二个测试,添加

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

并在MyWindowController.m中包含以下代码:

- (void)keyDown:(NSEvent *)theEvent{
    NSLog(@"%@", theEvent);
}
  • 首先测试,添加一个NSButton,然后运行项目
  • 第二个测试,添加一个WebView(NSButton已删除),然后运行该项目
  • 在这两个测试中,窗口都正确显示。但区别在于:

  • (NSButton)我可以在按下诸如“a”、“b”等键时看到日志输出,但不能按ESC键
  • (WebView)我可以在按下诸如“a”、“b”、“…、和ESC键等键时看到日志输出
  • 我将NSButton更改为其他视图类型,以及我的自定义视图,所有操作都与第一种情况类似

    我的问题是:

  • 为什么在第一种情况下NSWindowController不能捕获ESC键
  • 为什么NSWindowController以WebView作为第一响应程序捕获ESC键
  • 没有WebView,NSWindowController如何捕获ESC键

  • 嗯,我使用事件监视器来捕获ESC按键,请参见此处的详细信息:


    但是仍然没有得到WevView测试。

    请参见
    NSResponder
    取消操作:
    文档:

    此方法绑定到转义和命令-。(句号)钥匙。这个 “关键点”窗口首先在视图层次结构中搜索其关键点 等效项为Escape或Command-,以输入者为准。如果没有 这些视图处理等价的键,窗口发送默认值 取消操作的操作消息:发送给第一响应者和来自 在那里,消息沿着响应链向上传播。如果中没有响应者 响应程序链实现取消操作:,键窗口 在视图层次结构中搜索键等效为Escape的视图 (请注意,如果原始密钥等效,则这可能是多余的。) 逃脱)。如果找不到这样的响应程序,则会显示取消:操作消息 发送到实现的响应程序链中的第一个响应程序 它


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

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

        [[self window]makeFirstResponder:_viewControllerOfInterest];
    

    有两种方法可以检测ESC按键,以下是详细信息:解决方案是事件监视器: