表示Swift已经处理了keyUp事件?

Indicate that keyUp event has been handled in Swift?

在 NSTextView 中,我试图让 tab 和 shift-tab 在编辑文本时发挥作用,而不是在文本中插入制表符。目前我正在通过 NSTextViewDelegatekeyUp 方法检测按键:

override func keyUp(with event: NSEvent) {
    if let currChar = event.characters {
        if event.keyCode == 48 { // detect tab key
            if event.modifierFlags.rawValue == 256 { // detect no modifier key
                // do something
            } else if event.modifierFlags.rawValue == 131330 { // detect shift modifier
                // do another thing
            }
        }
   }

我在文档中看不到任何内容如何向 NSTextView 指示我希望它忽略制表键(我已尝试回答 ,但制表符未出现触发此事件),或阻止事件向上移动响应者链。

我还尝试在 keyUp 方法的开头调用 interpretKeyEvents([event]),并覆盖 insertTabinsertBacktab。这些可以通过正确的按键成功调用,但仍会在文本中插入一个制表符。 documentation 似乎建议它应该阻止插入标签:

It [keyDown] can pass the event to Cocoa’s text input management system by invoking the NSResponder method interpretKeyEvents:. The input management system checks the pressed key against entries in all relevant key-binding dictionaries and, if there is a match, sends a doCommandBySelector: message back to the view. Otherwise, it sends an insertText: message back to the view, and the view implements this method to extract and display the text. (emphasis mine)

文档讨论了如果事件未被处理则继续沿响应者链向上的事件 - 这是如何表示的?我使用 keyUp 而不是 keyDown 重要吗?

是的,覆盖 keyUp: 而不是 keyDown: 很重要。 key-down事件发生在key-up事件之前,NSTextView作用于key-down事件。当系统调用您的 keyUp: 覆盖时,阻止 key-down 事件的默认处理为时已晚。

使用自定义子类。如果没有调用这些方法,则意味着第一响应者是其他人并且已经吃掉了您的事件。只要您的 textview 是第一响应者,您的 keyDown 方法就会被调用。

class MyTextView: NSTextView {

    override func insertTab(_ sender: Any?) {
        self.insertText("HELLO", replacementRange: NSMakeRange(0, 0))
        //OR ANY CUSTOM TEXT EDITING, ACTION TO CHANGE FIRST RESPONDER...
    }
    override func insertBacktab(_ sender: Any?) {
        self.insertText("AAAAA", replacementRange: NSMakeRange(0, 0))
        //OR ANY CUSTOM TEXT EDITING, ACTION TO CHANGE FIRST RESPONDER...
    }

}

教育:"Key Event Handling in Cocoa Applications from WWDC 2010"