Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 识别用户在编辑NSTextField swift时是否按了箭头键_Macos_Swift_Keydown_Nstextfield - Fatal编程技术网

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

Macos 识别用户在编辑NSTextField swift时是否按了箭头键,macos,swift,keydown,nstextfield,Macos,Swift,Keydown,Nstextfield,我有许多NSTEXT字段,我想知道用户在编辑其中一个字段时是否按下了其中一个箭头键。功能 override func keyDown(theEvent: NSEvent) { switch theEvent.character { case NSRightArrowFunctionKey: println(1) moveGor(NSRightArrowFunctionKey) case NSLeftArrowFunctionKey:

我有许多NSTEXT字段,我想知道用户在编辑其中一个字段时是否按下了其中一个箭头键。功能

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])
    }
}

我在前面的函数中使用过,当文本字段有焦点时,它们实际上没有焦点。相反,文本视图将添加到文本字段顶部的窗口中,该文本视图是第一个响应者,并处理所有输入和编辑行为。文本视图称为。文本字段不接收按键关闭事件;文本视图没有

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

一个更有希望的方法可能是
-textView:doCommandBySelector:
。这也不是关于箭头键,但在某些方面它更好。箭头键和所有其他标准编辑键通过转换为命令选择器进行操作。命令选择器表示正在执行的语义操作,如
-moveUp:
。它们由修改器标志更改,因此上移箭头可能会生成
-moveUpAndModifySelection:


无论如何,在
-textView:doCommandBySelector:
中,您可以基于选择器执行代码,并告诉文本视图不要做任何其他事情(通过返回
YES
),或者让文本视图执行其正常操作(通过返回
NO
)。(显然,对于您不关心的任何内容,都返回
NO

我碰巧知道您有一个自定义的
NSEvent
扩展名,带有
字符
属性,但其他读者可能没有读过您前面的问题。所以你也应该在这里添加它。@MartinR,好的,我已经添加了一些从
NSTextField
继承的信息,并实现了
-textView:doCommandBySelector:
,但它没有被调用。我在这里遗漏了什么?没有细节很难知道。我知道你问了自己的问题,但也没有提供任何细节。是否确实在UI中使用自定义
NSTextField
子类的实例?好的,我解决了它-必须设置
NSTextField
的委托才能接收
-textView:doCommandBySelector:
调用。令人困惑的是,类型为
NSTextFieldDelegate
的委托未实现
-textView:doCommandBySelector:
,而不是执行
NSControlTextEditingDelegate
的委托。你可以在这个答案上加上这个。重写:
func控件(\control:NSControl,textView:NSTextView,doCommandBy commandSelector:Selector)->Bool