介绍
当我的自定义NSTextField处于“文本编辑模式”并且字段编辑器已作为firstResponder放在它前面时,我不再通过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类中 – 它不会导致任何错误,但也不会被调用.
问题
>在让代表电话上班时我错过了什么?
>除了创建我自己的自定义字段编辑器之外,这是唯一的方法吗?可以不询问textDidChange(通知:NSNotification)来产生按键吗?
>在使用控件(_:textView:doCommandBySelector :)委托方法时,如何捕获没有标准键绑定的按键.特别是,我想截取没有映射到任何标准选择器的组合键“shift enter”. (隐含问题:您是否只能映射到NSResponder中的标准键操作方法?)
解决方法
我相信我已经在NSTextField的代表及其fieldEditor及其代表的工作方面取得了更大的明确性.是的,每个人都有自己的委托,NSTextField会自动设置为fieldEditor的委托.
我正在向主机NSTextField添加委托.当fieldEditor是firstResponder时,这不会被调用,这是我所关注的.这也不是上述场景的重要代表.
似乎有用的是使NSTextField符合NSTextViewDelegate协议并专门覆盖该方法:
func textView(textView: NSTextView,shouldChangeTextInRange affectedCharRange: NSRange,replacementString: String) -> Bool
陷阱各种按键.