【问题标题】:How to capture escape key in an NSWindow?如何在 NSWindow 中捕获转义键?
【发布时间】:2017-03-04 07:05:46
【问题描述】:

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

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

我将 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 对象不会收到事件?

【问题讨论】:

  • stackoverflow.com/questions/28739846 的启发,我尝试将视图上的按钮的“等效键”设置为转义(⎋),但没有运气。我还尝试了更典型的键,比如 command-A,但也没有运气。
  • 当您按下退出键时,哪个视图是第一响应者?任何捕获 keydown 事件的自定义视图?
  • 检查这个答案:stackoverflow.com/questions/11622255/keydown-not-being-called。您需要确保您的窗口可以成为主窗口和关键窗口,并且不是无边框窗口。
  • jvarela:宾果游戏!在其外观中添加“标题栏”可以修复它。或覆盖canBecomeKey

标签: macos cocoa nsviewcontroller nsevent nsresponder


【解决方案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 类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多