缺少有意义的键组合上的keyUp事件(例如"选择直到行首")

feb*_*ing 4 macos cocoa objective-c

我有一个NSTextField,它用作扩展的NSTextFieldCell,它创建一个自定义字段编辑器,拦截并记录关键事件.(了解关键事件对于应用程序很重要,但是文本字段仍然应该像往常一样工作,通过调用[super ...]方法).这是官方文档对此问题的建议.

我确实keyUp在打字时收到大多数活动,但在某些情况下我没有收到.当按下一个附有动作的组合键时,似乎会发生这种情况.例如Cmd-Shift-Left,不发出keyUp事件.该输入使得从点到开头的整行显示为选中,但是已经keyDown接收到.

在那些缺失的情况下,当-performKeyEquivalent:通过覆盖它来看时,我看到它被称为.为什么keyUp没有交付?

Nat*_*teS 10

对于其他人来说,这是"修复"它的代码:

- (void)sendEvent:(NSEvent *)event {
    if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask))
        [[self keyWindow] sendEvent:event];
    else
        [super sendEvent:event];
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*man 7

这就是事件架构的设置方式.发送密钥等效消息比发送作为其中一部分的各种密钥的消息更受欢迎.请参阅"处理关键事件",特别是"处理关键等价物".看起来你可以子类化NSApplication和覆盖-sendEvent:来调度这些事件,但是你可能会破坏比你添加的功能更多的功能.