在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])
,并覆盖keyUp
和insertTab
。使用正确的按键成功调用它们,但仍会在文本中插入选项卡。 documentation似乎暗示它应该阻止插入标签:
它[
insertBacktab
]可以通过调用NSResponder方法keyDown
将事件传递给Cocoa的文本输入管理系统。输入管理系统根据所有相关的键绑定词典中的条目检查按下的键,如果匹配,则将interpretKeyEvents:
消息发送回视图。 否则,它会将一个insertText:消息发送回视图,视图会实现此方法以提取和显示文本。(强调我的)
如果没有处理,文档会讨论一个事件继续响应者链 - 这是如何表明的?我使用doCommandBySelector:
而不是keyUp
答案 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可可应用程序中的关键事件处理”