2

该方法在我已覆盖setEnabled:的子类中不起作用和。我觉得按钮的启用/禁用应该在这些功能之外——当按钮被禁用时,它不应该首先接收鼠标事件。NSButtonmouse{down,drag,up}rightMouse{down,drag,up}

当我覆盖这些函数时,我是否必须明确地进行检查?

4

1 回答 1

2

我认为您确实需要自己检查。

正如Apple 关于 Cocoa Event Architechture 的文章中所解释的,包含您的按钮的窗口正在向您的按钮发送mouseDown:(或任何其他合适的方法)以响应接收事件。为了让窗口决定不发送消息,它必须首先确定按钮是NSControl子类(enabled是 的属性NSControl,但不是NSView),然后检查该enabled标志。这超出了窗口的职责范围。启用的控件不像第一响应者状态那样是事件调度系统的一部分。

作为一个有趣的见解,如果您查看GNUStep 的-[NSControl mouseDown:]实现,它们确实会[self isEnabled]在处理事件之前进行检查。

于 2013-07-04T02:38:00.730 回答