Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Cocoa 如何在NSTextField的字段编辑器中拦截击键? 简介_Cocoa_Nstextfield_Appkit_Nsresponder - Fatal编程技术网

Cocoa 如何在NSTextField的字段编辑器中拦截击键? 简介

Cocoa 如何在NSTextField的字段编辑器中拦截击键? 简介,cocoa,nstextfield,appkit,nsresponder,Cocoa,Nstextfield,Appkit,Nsresponder,当我的自定义NSTextField处于“文本编辑模式”且字段编辑器作为第一响应者放置在它前面时,我不再通过NSTextField.keyDown(…)获得击键。据我所知,击键现在通过字段编辑器进行路由。大多数在线建议在自定义NSTextField的委托中重写以下方法: control(_:textView:doCommandBySelector:) 我确实重写了这个方法,但它似乎没有被调用?见下面的代码: class FocusDelegate: NSObject, NSTextFieldDe

当我的自定义
NSTextField
处于“文本编辑模式”且
字段编辑器作为
第一响应者放置在它前面时,我不再通过
NSTextField.keyDown(…)
获得击键。据我所知,击键现在通过
字段编辑器进行路由。大多数在线建议在自定义
NSTextField
的委托中重写以下方法:

control(_:textView:doCommandBySelector:)
我确实重写了这个方法,但它似乎没有被调用?见下面的代码:

class FocusDelegate: NSObject, NSTextFieldDelegate{

    func control(control: NSControl, textView: NSTextView, doCommandBySelector commandSelector: Selector) -> Bool {

        println("FocusDelegate")
        if commandSelector == Selector("cancelOperation:"){
            println("cancelOperation")
            control.abortEditing()
            return true
        }
        return false
    }
}
我唯一要做的另一件事是将自定义
NSTextField
的委托设置为上述类的实例。我还尝试将上面的方法直接放入定制的
NSTextField
类中-它不会导致任何错误,但也不会被调用

问题
  • 在让代表们打电话上班的过程中,我遗漏了什么
  • 除了创建自己的自定义字段编辑器之外,这是唯一的方法吗?不能通过询问
    textdichange(通知:NSNotification)
    来产生按下的键吗
  • 在使用
    控件(uu:textView:doCommandBySelector:)
    delegate方法时,我如何捕捉按下没有标准键绑定的键。特别是,我想截取不映射到任何标准选择器的组合键“shift+enter”。(隐含问题:能否仅映射到NSResponder中的标准键操作方法?)

  • 我相信我已经更清楚地了解了
    NSTextField
    及其委托人和fieldEditor及其委托人的工作原理。是的,每个字段都有自己的委托,
    NSTextField
    自动设置为
    fieldEditor
    的委托

    我正在将代理添加到主机
    NSTextField
    。当
    fieldEditor
    firstResponder
    时,不会调用此函数,这正是我所关心的。对于上述场景,这也不是重要的委托

    看起来有用的是使
    NSTextField
    符合
    NSTextViewDelegate
    协议,并特别覆盖该方法:

     func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String) -> Bool
    
    捕捉各种按键


    textdichange(notification:NSNotification)
    中的通知在此场景中不起作用,因为它是在按键后报告的。

    当你说公式编辑器时,你是指字段编辑器吗?@JWWalker LOL,把我使用它的目的和它的官方名称混淆了!感谢您指出这一点。您是否需要在函数签名中使用下划线(
    \u
    )以使其匹配?这些文档具有
    func控件(control:NSControl,textView-textView:NSTextView,doCommandBySelector命令:选择器)
    。如果你用那个签名,它会被称为吗?@Kenthomass我认为下划线是在转移视线。上面的代码是由Xcode自动完成的。请参阅下面我的答案。不幸的是,此解决方案不适用于箭头键。