如果不是第一响应者,为啥我可以单击 NSButton?

Posted

技术标签:

【中文标题】如果不是第一响应者,为啥我可以单击 NSButton?【英文标题】:Why can I click an NSButton if it's not first responder?如果不是第一响应者,为什么我可以单击 NSButton? 【发布时间】:2014-04-26 18:36:47 【问题描述】:

我正在尝试在 C++ 中实现像 NSResponder 这样的类,但我不明白的是:

所有键盘/鼠标交互都发送给第一响应者,例如,如果 NSTextField 当前是第一响应者,同一视图中的另一个 NSButton 如何知道它已被点击?如果文本字段不希望鼠标单击,它将把它发送到它的超级视图,它的超级视图将它发送到视图控制器。所以鼠标点击事件永远不会到达按钮。

这可能很明显,但我现在无法理解它。

【问题讨论】:

【参考方案1】:

所有键盘/鼠标交互都发送给第一响应者

这是不正确的。来自Cocoa Event Handling Guide:

window 对象……将大多数事件分派给 NSView 对象 与 NSResponder 消息中的用户操作相关联,例如 mouseDown: 或 keyDown:。 …

接收事件消息的对象因类型而略有不同 事件。对于鼠标和平板电脑事件,NSWindow 对象调度 用户按下鼠标或触控笔的视图的事件 按钮。它将大多数关键事件分派给第一个响应者 关键窗口。

鼠标和按键事件的路径之间的区别在特定于这些类型事件的相关部分中重复。

一个按钮“知道”它何时被点击,因为它是被点击的东西。窗口使用-[NSView hitTest:] 方法找出鼠标光标下的内容。

【讨论】:

如果鼠标移出按钮,如果鼠标事件没有发送给他,按钮怎么知道鼠标不在了。例如,如果图像更改为悬停图像,并且当鼠标移出时按钮需要将其更改回正常图像? 首先,按钮很可能在其-mouseDown: 实现中启动了一个内部事件循环。因此,它会获取 all 事件,直到鼠标向上为止。但即使它没有,我链接到的同一个文档说,更进一步:“鼠标拖动和鼠标向上事件通常被发送到接收最新鼠标向下事件的同一个视图。”跨度> 我读了几次你的回答,我花了一段时间才理解你所做的区分,所以这里是黑白的,以供将来搜索:1)对于mouse clicks,事情鼠标下接收事件消息,例如一个 NSButton。 2)对于(大多数)key presses on your keyboard,窗口的第一响应者接收到事件消息。

以上是关于如果不是第一响应者,为啥我可以单击 NSButton?的主要内容,如果未能解决你的问题,请参考以下文章

NSTableView 响应面板中的第一次单击

把Button设置为不可用时为啥还可以响应单击事件

以编程方式创建的 uiview 在第一次单击时没有响应

确定是不是所有控件都可以获得焦点(即成为第一响应者)

为啥我的页面可以获取 Vue.js 2 数据属性但它不是响应式的?

为啥在我第一次单击按钮时在我的 RecyclerView 中调用绑定?