识别用户在编辑 NSTextField swift 时是否按下了箭头键

pom*_*nto 2 macos keydown nstextfield swift

我有很多 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎不起作用。有没有其他方法可以快速做到这一点?

编辑:

我有以下扩展名NSEvent

extension NSEvent {
    var character: Int {
        let str = charactersIgnoringModifiers!.utf16
        return Int(str[str.startIndex])
    }
}
Run Code Online (Sandbox Code Playgroud)

我在之前的函数中使用的

Ken*_*ses 5

当文本字段具有焦点时,它们实际上没有。相反,文本视图被添加到文本字段顶部的窗口中,该文本视图是第一响应者并处理所有输入和编辑行为。文本视图被称为“字段编辑器”。文本字段不接收按键事件;文本视图可以。

您可以将自定义文本视图替换为文本字段的第一响应者,并让该文本视图专门处理按键事件。但是,利用文本字段是文本视图的代理这一事实可能更容易。根据您要实现的目标,您可能会实施-textView:willChangeSelectionFromCharacterRange:toCharacterRange:,但这不仅仅与箭头键有关。

一个更有前途的方法可能是-textView:doCommandBySelector:。这也不是关于箭头键,但在某些方面它更好。箭头键和所有其他标准编辑键通过键绑定系统转换为命令选择器来操作。命令选择器代表正在执行的语义操作,如-moveUp:。它们由修饰符标志更改,因此 Shift-up-arrow 可能会生成-moveUpAndModifySelection:.

无论如何,在 中-textView:doCommandBySelector:,您可以根据选择器执行代码,并告诉文本视图不要做任何其他事情(通过返回YES)或让文本视图另外做它正常的事情(通过返回NO)。(显然,返回NO任何你不关心的东西。)