使用箭头键作为NSMenuItem的关键等价物

时间:2016-09-09 11:38:41

标签: objective-c macos cocoa event-handling appkit

尝试使用不带修饰符的箭头键作为主菜单栏中菜单项的等效键时,我遇到了一些事件处理问题。我遇到的问题是主菜单栏在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 +)

0 个答案:

没有答案