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自动完成的。请参阅下面我的答案。不幸的是,此解决方案不适用于箭头键。