2

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

现在我想要“退出”键来关闭窗口。我已经看到了几个关于此的问题,但没有一个与我所看到的行为相匹配。

我将 NSWindowController 和 NSViewController 子类化,并将情节提要中的控制器设置为这些。我已经尝试了所有我能找到或想到的方法,包括:

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

在窗口控制器、视图控制器,甚至是自定义的 NSWindow 子类中,但这些方法都没有被调用。我已经确认viewDidLoad()并且windowDidLoad()确实会被调用,所以我的课程正在被使用。他们只是没有得到事件。

为了验证我的理智,我尝试检查响应者链正如预期的那样,我的自定义窗口控制器和视图控制器类都在其中,NSWindow 子类也是如此。

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

4

1 回答 1

1
// 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 类中。

于 2018-02-06T09:47:12.243 回答