7

我有一个 NSView 覆盖其父窗口的内容视图。此视图有一个单击事件处理程序,可将其从内容视图中删除。在这个观点中,我有另一个观点。当我在这个内部视图中拖动鼠标时,鼠标事件不仅应用于前面的视图,还应用于后面的视图。此外,来自后面视图的光标也会显示出来。这与这里发生的问题相同:NSView 覆盖将鼠标事件传递给底层子视图?但是那里的答案对我的项目不起作用,因为我无法打开另一个窗口。

4

2 回答 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 回答