我有很多NSTextFields,我想知道,如果用户在编辑其中一个时按下了其中一个箭头键。功能
override func keyDown(theEvent: NSEvent) {
switch theEvent.character {
case NSRightArrowFunctionKey:
println(1)
moveGor(NSRightArrowFunctionKey)
case NSLeftArrowFunctionKey:
moveGor(NSLeftArrowFunctionKey)
case NSUpArrowFunctionKey:
moveVert(NSUpArrowFunctionKey)
case NSDownArrowFunctionKey:
moveVert(NSDownArrowFunctionKey)
default:
super.keyDown(theEvent)
}
}
似乎不起作用。有没有其他方法可以在swift中做到这一点?
修改
我有NSEvent
的扩展程序:
extension NSEvent {
var character: Int {
let str = charactersIgnoringModifiers!.utf16
return Int(str[str.startIndex])
}
}
我在之前的功能
中使用过的答案 0 :(得分:4)
当文本字段具有焦点时,它们实际上并不是。相反,文本视图将添加到文本字段顶部的窗口中,该文本视图是第一个响应者并处理所有输入和编辑行为。文本视图称为"field editor"。文本字段不接收按键事件;文本视图。
您可以将自定义文本视图替换为文本字段的第一个响应者,并让该文本视图专门处理按键事件。但是,可能更容易利用文本字段是文本视图的委托这一事实。根据您尝试实现的目标,您可以实施-textView:willChangeSelectionFromCharacterRange:toCharacterRange:
,但这并不仅仅是关于箭头键。
更有前途的方法可能是-textView:doCommandBySelector:
。这也不是关于箭头键,但在某些方面它更好。箭头键和所有其他标准编辑键通过the key bindings system转换为命令选择器来操作。命令选择器表示正在执行的语义操作,如-moveUp:
。它们由修饰符标志更改,因此Shift-up-arrow可能会生成-moveUpAndModifySelection:
。
无论如何,在-textView:doCommandBySelector:
中,您可以根据选择器执行代码,并告诉文本视图不要做任何其他操作(通过返回YES
)或让文本视图执行其正常操作加法(通过返回NO
)。 (显然,对于您不关心的任何事情,请返回NO
。)