为啥 -[NSTextInputClient doCommandBySelector:] 不应该将事件传递到响应者链上?
Posted
技术标签:
【中文标题】为啥 -[NSTextInputClient doCommandBySelector:] 不应该将事件传递到响应者链上?【英文标题】:Why should -[NSTextInputClient doCommandBySelector:] not pass the event up the responder chain?为什么 -[NSTextInputClient doCommandBySelector:] 不应该将事件传递到响应者链上? 【发布时间】:2018-01-20 09:10:29 【问题描述】:文本视图不应将不可调用的命令向上转发到响应者链上,the docs say for -[NSTextInputClient doCommandBySelector:]
:
如果无法调用
aSelector
,则doCommandBySelector:
不应将此消息向上传递到响应者链。NSResponder
也实现了这个方法,它确实将不可调用的命令转发到响应者链上,但文本视图不应该。实现NSTextInputClient
协议的文本视图继承自NSView,
,后者继承自NSResponder
,因此您对此方法的实现将覆盖NSResponder
中的那个。它不应该调用 super。
如果我的文字理解没有让我失望,最后一句话没有说明,只是重新表述了事情是如何设置的。
所以基本上只有一个处方:“文本视图不应该”。期间。
但是为什么呢?
我可以理解这样一种情况,例如,您希望文本视图不对任何/所有 NSResponder
方法做出反应,而是将它们委托给它的视图控制器。这会引起麻烦吗?这是否只是建议在 macOS 应用中保持文本视图行为一致?
【问题讨论】:
委托给委托对象与向上传递响应者链不同。 我还是不明白。NSTextView
是由于继承自 NSView,
响应者链的一部分。 NSTextInputClient
协议与 NSResponder
(doCommandBySelector:
) 具有相同的方法要求,但具有更强的声明。这难道不意味着NSTextView
s 吞下doCommandBySelector:
调用链中的调用吗?如果是这样,那为什么是可取的?
【参考方案1】:
来自The Key-Input Message Sequence:
如果第一响应者是文本视图,则按键事件进入文本系统。键窗口向文本视图发送一个 keyDown: 消息,并将事件作为其参数。 keyDown: 方法将事件传递给 handleEvent:,它将字符输入发送到输入上下文以进行键绑定和解释。作为响应,输入上下文将 insertText:replacementRange:、setMarkedText:selectedRange:replacementRange: 或 doCommandBySelector: 发送到文本视图。
如果文本视图处理按键事件并且滚动视图或其他视图接收到doCommandBySelector:
消息,那将是不正确的。您不能将doCommandBySelector:
发送给super
,但您可以将选择器发送给委托人。
【讨论】:
好发现!不过,“这不会是正确的”是相当模糊的。在您的滚动视图示例中,我发现当视图堆栈上的每个人都处理事件时,这可能会导致问题。以上是关于为啥 -[NSTextInputClient doCommandBySelector:] 不应该将事件传递到响应者链上?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?