我有一个 NSView 覆盖其父窗口的内容视图。此视图有一个单击事件处理程序,可将其从内容视图中删除。在这个观点中,我有另一个观点。当我在这个内部视图中拖动鼠标时,鼠标事件不仅应用于前面的视图,还应用于后面的视图。此外,来自后面视图的光标也会显示出来。这与这里发生的问题相同:NSView 覆盖将鼠标事件传递给底层子视图?但是那里的答案对我的项目不起作用,因为我无法打开另一个窗口。
问问题
5914 次
2 回答
14
如果没有看到您的事件处理代码,很难知道发生了什么,但我怀疑您可能正在调用您super
的实现中各种事件处理方法的实现。
NSView
是 的子类NSResponder
,因此默认情况下未处理的事件会向上传递到响应者链。视图的父视图是响应者链中的下一个对象,因此如果您调用,例如,[super mouseDown:event]
在您的实现中‑mouseDown:
,事件将被传递给父视图。
解决方法是确保您不在事件处理程序中调用super
' 实现。
这是不正确的:
- (void)mouseDown:(NSEvent*)anEvent
{
//do something
[super mouseDown:event];
}
这是对的:
- (void)mouseDown:(NSEvent*)anEvent
{
//do something
}
于 2011-07-06T03:08:00.993 回答
2
Rob 的答案和 Maz 对该答案的评论解决了这个问题,但只是为了让它绝对明确。为了防止 NSView 将其鼠标事件传递给父级,必须实现空方法。
// NSResponder =========================================
- (void) mouseDown:(NSEvent*)event {}
- (void) mouseDragged:(NSEvent*)event {}
- (void) mouseUp:(NSEvent*)event {}
于 2013-02-08T00:23:51.907 回答