尝试使用不带修饰符的箭头键作为主菜单栏中菜单项的等效键时,我遇到了一些事件处理问题。我遇到的问题是主菜单栏在tableView能够执行之前将按键事件处理为键等效事件。当tableView是第一个响应者时,向上/向下箭头键不会更改tableView的选择,而是在主菜单栏中触发等效键。
这样做的原因是箭头键的传入keyDown
事件首先传递到目标窗口上的performKeyEquivalent
,而目标窗口又将该事件传递到链中。 NSTableView
没有对此做出响应,因此事件会重新响应应用程序,然后通过performKeyEquivalent
将其调度到主菜单,从而消耗该事件。
如果主菜单没有等效的键,那么事件将返回到窗口并通过keyDown
向下链接,tableView会响应并正确处理。
Apple(或多或少)在Event Handling Guide中记录了这一点。
是否有正确的方法来处理关键字等效项,例如没有修饰符的箭头键,这样它们既可以显示在菜单项中,也可以被任何可能处理它们的子视图正确使用?
我尝试了各种各样的技巧,但每个技巧都有很多优点和缺点:
NSMenu代表
可以实现menuHasKeyEquivalent
,但似乎必须为整个主菜单实现该功能。虽然您可以轻松地过滤掉箭头键,但您还必须验证每个其他等效键,这不是很实用。
子类NSApplication
您可以在NSApplication中覆盖sendEvent:
,但用于跟踪您在事件处理链中的位置的逻辑有点毛茸茸。
NSEvent点击
与子类NSApplication
类似。事情在这里有点干净,因为我可以作弊并让事件更接近tableView,但你仍然留下了很多逻辑来确定点击何时应该消耗事件和"强制-feed"它与tableView相比,你应该让事件正常处理。
我很好奇是否有任何关于如何在没有修饰符存在且可能存在tableView的情况下如何最好地将箭头键实现为等效键的建议。
(macOS 10.11 +)