我能够通过我的窗口控制器的 keyDown: 方法成功地对键盘事件做出反应。
执行鼠标拖动时出现问题:
键盘事件似乎被延迟并且只会在鼠标启动时触发。
明确地说,我的意思是:
• 在窗口控制器的 keyDown: 方法中放置一个日志语句
• 启动您的应用程序,执行一些拖动操作(例如在 NSSlider 上)
• 在保持拖动的同时,按任意键:没有日志到控制台。
• 释放拖动:出现日志,是的……</p>
我拖动的控件是一个自定义的 NSSlider。
我已经使用“鼠标跟踪循环”方法实现了拖动机制。据我了解,在拖动时,NSApplication 的主运行循环模式正在切换到 NSEventTrackingRunLoopMode,从而限制传入事件。
所以,我只是在我的跟踪循环中添加了 NSKeyDownMask 和 NSKeyUpMask,当遇到时,相应地调用 self.nextResponder keyDown/up: 方法。对于这个特定的自定义子类,我的问题得到了解决。
但是 Cocoa 的原生控件呢?我无法编写该异常...
我曾希望 NSEvent 的“addLocalMonitorForEventsMatchingMask:”方法,但可惜的是,doc 说:“不会为嵌套事件跟踪循环所消耗的事件调用,例如控件跟踪、菜单跟踪或窗口拖动”。
那么,不管应用程序的运行循环模式如何,是否有一个简单的解决方案来接收键盘事件?