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

时间:2014-04-26 18:36:48

标签: c++ cocoa first-responder nsresponder

我正在尝试在C ++中实现类似NSResponder的类,我不明白的是:

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

这可能很明显,但我现在无法绕过它。

1 个答案:

答案 0 :(得分:3)

  

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

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

  

窗口对象...将大多数事件调度到NSView对象   与NSResponder消息中的用户操作相关联,例如   mouseDown:或keyDown:。 ...

     

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

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

按钮"知道"当它被点击时,因为它是被点击的东西。该窗口使用-[NSView hitTest:]方法计算出鼠标光标下的内容。