【发布时间】:2013-08-05 13:10:18
【问题描述】:
我能够通过我的窗口控制器的 keyDown: 方法成功地对键盘事件做出反应。
执行鼠标拖动时出现问题:
键盘事件似乎被延迟并且只会在鼠标启动时触发。
要清楚,我的意思是:
• 在窗口控制器的 keyDown 中放置一条日志语句:方法
• 启动您的应用程序,执行一些拖动操作(例如在 NSSlider 上)
• 在保持拖动的同时,按任意键:控制台不会记录任何内容。
• 释放拖动:出现日志,是的……
我拖动的控件是一个自定义的 NSSlider。
我已经使用“鼠标跟踪循环”方法实现了拖动机制。
据我了解,在拖动时,NSApplication 的主运行循环模式正在切换到 NSEventTrackingRunLoopMode,从而限制传入事件。
所以,我只是在我的跟踪循环中添加了 NSKeyDownMask 和 NSKeyUpMask,当遇到时,相应地调用 self.nextResponder keyDown/up: 方法。 对于这个特定的自定义子类,我的问题已解决。
但是 Cocoa 的原生控件呢?我无法编写该异常...
我曾希望 NSEvent 的“addLocalMonitorForEventsMatchingMask:”方法 但遗憾的是,doc 说:“不会为嵌套事件跟踪循环所消耗的事件调用,例如控件跟踪、菜单跟踪或窗口拖动”。
那么,不管应用程序的运行循环模式如何,是否有一种直接的解决方案来接收键盘事件?
【问题讨论】:
-
我有一个类似的问题,当我使用“鼠标跟踪循环”方法时,计时器似乎没有触发——无论我将计时器添加到哪种运行循环模式。当下拉顶级菜单时,计时器会触发...... - 那么这方面有什么进展吗?
标签: objective-c cocoa event-handling nsrunloop