如何在NSWindow中捕获转义键?

时间:2017-03-04 07:05:47

标签: macos cocoa nsviewcontroller nsevent nsresponder

我有一个带有NSWindowController(故事板入口点)的故事板,其内容是NSViewController。当用户在我的应用程序中选择一个menuitem时,我会加载故事板并显示它。

现在我想要"逃避"关闭窗口的关键。我已经看到了几个有关此问题的问题,但没有一个与我所看到的行为相符。

我将NSWindowController和NSViewController子类化,并将故事板中的控制器设置为那些。我试过every method I could find或想到了,包括:

  • override func cancelOperation(_ sender: Any?)
  • func cancel(_ sender: Any?)
  • override func keyDown(with event: NSEvent)

在窗口控制器,视图控制器,甚至是自定义的NSWindow子类中,但这些方法都不会被调用。我已确认viewDidLoad()windowDidLoad()已被调用,因此我的课程已被使用。他们只是没有得到活动。

为了验证我的理智,我尝试了inspecting the responder chainAs expected,我的自定义窗口控制器和视图控制器类都在其中,NSWindow子类也是如此。

为什么响应者链中的NSResponder对象不会接收事件?

1 个答案:

答案 0 :(得分:0)

// monitor ESC key
NSEvent* (^handler)(NSEvent*) = ^(NSEvent *event) {
    if(event.keyCode == 53) {
        [self keyDown:event];
    }
    return event;
};
eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:handler];

将这些代码放入NSWindowController或AppDelegate类中。