在NSView中击键后防止“不允许”发出蜂鸣声

时间:2012-01-15 12:01:14

标签: objective-c macos

在我的Mac应用程序中,我通过NSView中的keyUp函数覆盖并接受某些击键,这并不意味着接受击键。

当按下某个键时,keyUp函数调用,我确实处理了按键,甚至没有调用super keyUp:,一切正常,除了它也是当你在不应该按某个键的地方按下键时,会发出默认的'doonk'声音。

有没有办法表明按键处理和接受,而且我不需要发出嘟嘟声告诉用户它不是?

4 个答案:

答案 0 :(得分:11)

我认为(但我不是100%肯定的,自从我这样做以来已经过了一段时间)您还需要覆盖NSView和/或NSResponder performKeyEquivalent:方法。在那里,您将返回YES以向呼叫者表明您确实处理了该事件。

这将使“dooonk”声音不再发生。

答案 1 :(得分:1)

就我而言,performKeyEquivalent 没有捕获 Enter 键。哔声是在 keyDown 事件中触发的。此 Swift 代码可防止在处理 Enter 键时发出哔哔声:

override func keyDown(with event: NSEvent) {
    if event.keyCode != 36 {
        super.keyDown(with: event)
    }
}

override func keyUp(with event: NSEvent) {
    if event.keyCode == 36 {
        // Do your thing
    }
}

答案 2 :(得分:0)

您可能希望使用keyUp:操作,而不是使用moveUp:,因为它需要确定处理混合中哪个键的所有麻烦。还有类似命名的用于向下的例程和用于处理带有选择的移动的各种等等。

有关此问题的进一步文档,请参阅Cocoa Event-Handling Guide,特别是“处理键盘操作和插入文本”,其中讨论了在“其他那些处理文本的应用程序”中使用这些命令。

特别是,使用这些操作的另一个好处是它可以避免键解释或特殊键盘和键盘布局的任何问题。

答案 3 :(得分:0)

可接受的答案可能会解决问题,但我想提出一种解决问题的更正确方法:)

完全可以使用keyUp:keyDown:,但是最重要的是,您的视图还必须遵循AppKit响应器模式(您可以在official documentation上了解有关NSResponder的更多信息)。

在您的情况下,视图将需要将自己指示为事件链中的有效第一响应者。假设您有一个NSView子类,则需要实现以下方法:

@implementation MyNSView

//...

- (BOOL)acceptsFirstResponder {
    return YES;
}

@end