我有一个带有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 chain。 As expected,我的自定义窗口控制器和视图控制器类都在其中,NSWindow子类也是如此。
为什么响应者链中的NSResponder对象不会接收事件?
答案 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类中。