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