如何拦截NSTextField的字段编辑器中的击键?

时间:2015-03-06 15:12:40

标签: cocoa nstextfield appkit nsresponder

简介

当我的自定义NSTextField处于“文本编辑模式”且field editor已放在firstResponder前面时,我不再通过NSTextField.keyDown(...)获得击键。我知道现在通过field editor路由击键。大多数在线建议都是在自定义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类中 - 它不会导致任何错误,但也不会被调用。

问题

  1. 上面提到委托代理电话的工作原因我错过了什么?
  2. 除了创建自己的自定义字段编辑器之外,这是唯一的方法吗?是否可以textDidChange(notification: NSNotification)询问是否按下按键?
  3. 在使用control(_:textView:doCommandBySelector:)委托方法时,如何捕获按 NOT 的键具有标准键绑定。特别是,我想截取没有映射到任何标准选择器的组合键“shift + enter”。 (隐含问题:您是否只能映射到NSResponder中的标准键操作方法?)

1 个答案:

答案 0 :(得分:3)

我相信我已经在NSTextField其代表及其现场编辑及其代表的工作方面取得了更大的明确性。是的,每个人都有自己的委托,NSTextField会自动设置为fieldEditor的委托。

我正在向主持人NSTextField添加委托。当fieldEditorfirstResponder时,这将 NOT 被调用,这是我所关注的。这也不是上述场景的重要代表。

似乎有用的是使NSTextField符合NSTextViewDelegate协议并明确覆盖该方法:

 func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String) -> Bool

捕获各种按键。

textDidChange(notification: NSNotification)中的通知在此方案中无用,因为它是 AFTER 按键报告。