表示Swift已经处理了keyUp事件?
Indicate that keyUp event has been handled in Swift?
在 NSTextView 中,我试图让 tab 和 shift-tab 在编辑文本时发挥作用,而不是在文本中插入制表符。目前我正在通过 NSTextViewDelegate
的 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
}
}
}
我在文档中看不到任何内容如何向 NSTextView
指示我希望它忽略制表键(我已尝试回答 ,但制表符未出现触发此事件),或阻止事件向上移动响应者链。
我还尝试在 keyUp
方法的开头调用 interpretKeyEvents([event])
,并覆盖 insertTab
和 insertBacktab
。这些可以通过正确的按键成功调用,但仍会在文本中插入一个制表符。 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"
在 NSTextView 中,我试图让 tab 和 shift-tab 在编辑文本时发挥作用,而不是在文本中插入制表符。目前我正在通过 NSTextViewDelegate
的 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
}
}
}
我在文档中看不到任何内容如何向 NSTextView
指示我希望它忽略制表键(我已尝试回答
我还尝试在 keyUp
方法的开头调用 interpretKeyEvents([event])
,并覆盖 insertTab
和 insertBacktab
。这些可以通过正确的按键成功调用,但仍会在文本中插入一个制表符。 documentation 似乎建议它应该阻止插入标签:
It [
keyDown
] can pass the event to Cocoa’s text input management system by invoking the NSResponder methodinterpretKeyEvents:
. The input management system checks the pressed key against entries in all relevant key-binding dictionaries and, if there is a match, sends adoCommandBySelector:
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"