该方法在我已覆盖setEnabled:
的子类中不起作用和。我觉得按钮的启用/禁用应该在这些功能之外——当按钮被禁用时,它不应该首先接收鼠标事件。NSButton
mouse{down,drag,up}
rightMouse{down,drag,up}
当我覆盖这些函数时,我是否必须明确地进行检查?
我认为您确实需要自己检查。
正如Apple 关于 Cocoa Event Architechture 的文章中所解释的,包含您的按钮的窗口正在向您的按钮发送mouseDown:
(或任何其他合适的方法)以响应接收事件。为了让窗口决定不发送消息,它必须首先确定按钮是NSControl
子类(enabled
是 的属性NSControl
,但不是NSView
),然后检查该enabled
标志。这超出了窗口的职责范围。启用的控件不像第一响应者状态那样是事件调度系统的一部分。
作为一个有趣的见解,如果您查看GNUStep 的-[NSControl mouseDown:]
实现,它们确实会[self isEnabled]
在处理事件之前进行检查。