为啥 -[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:) 具有相同的方法要求,但具有更强的声明。这难道不意味着NSTextViews 吞下doCommandBySelector: 调用链中的调用吗?如果是这样,那为什么是可取的? 【参考方案1】:

来自The Key-Input Message Sequence:

如果第一响应者是文本视图,则按键事件进入文本系统。键窗口向文本视图发送一个 keyDown: 消息,并将事件作为其参数。 keyDown: 方法将事件传递给 handleEvent:,它将字符输入发送到输入上下文以进行键绑定和解释。作为响应,输入上下文将 insertText:replacementRange:、setMarkedText:selectedRange:replacementRange: 或 doCommandBySelector: 发送到文本视图。

如果文本视图处理按键事件并且滚动视图或其他视图接收到doCommandBySelector: 消息,那将是不正确的。您不能将doCommandBySelector: 发送给super,但您可以将选择器发送给委托人。

【讨论】:

好发现!不过,“这不会是正确的”是相当模糊的。在您的滚动视图示例中,我发现当视图堆栈上的每个人都处理事件时,这可能会导致问题。

以上是关于为啥 -[NSTextInputClient doCommandBySelector:] 不应该将事件传递到响应者链上?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?