表明在Swift中处理了keyUp事件?

时间:2018-02-21 15:28:23

标签: swift macos cocoa nstextview

在NSTextView中,我试图使制表符和shift-tab在编辑文本时起作用,而不在文本中插入制表符。目前,我正在通过NSTextViewDelegate的{​​{1}}方法检测按键:

keyUp

我在文档中看不到如何向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 } } } 表明我希望它忽略Tab键(我已经尝试了答案shown here,但是标签似乎没有触发此事件),或阻止事件向上移动响应链。

我还尝试在NSTextView方法的开头调用interpretKeyEvents([event]),并覆盖keyUpinsertTab。使用正确的按键成功调用它们,但仍会在文本中插入选项卡。 documentation似乎暗示它应该阻止插入标签:

  

它[insertBacktab]可以通过调用NSResponder方法keyDown将事件传递给Cocoa的文本输入管理系统。输入管理系统根据所有相关的键绑定词典中的条目检查按下的键,如果匹配,则将interpretKeyEvents:消息发送回视图。 否则,它会将一个insertText:消息发送回视图,视图会实现此方法以提取和显示文本。(强调我的)

如果没有处理,文档会讨论一个事件继续响应者链 - 这是如何表明的?我使用doCommandBySelector:而不是keyUp

这一点很重要吗?

2 个答案:

答案 0 :(得分:1)

是的,重要的是你要覆盖keyUp:而不是keyDown:。按键事件发生在按键事件之前,NSTextView对按键事件起作用。当系统调用keyUp:覆盖时,阻止默认处理按键事件为时已晚。

答案 1 :(得分:0)

使用自定义子类。如果没有调用这些方法,则意味着第一响应者是其他人并且已经吃掉了您的事件。只要你的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...
    }

}

教育:“WWDC 2010可可应用程序中的关键事件处理”