【发布时间】: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 chain。 As 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