鼠标事件通过NSView流血

时间:2011-07-06 01:55:33

标签: cocoa nsview nsevent

我有一个NSView,它涵盖了父窗口的内容视图。此视图具有单击事件处理程序,可将其从内容视图中删除。在这个视图中,我有另一种观点。当我在此内部视图中拖动鼠标时,鼠标事件不仅应用于前面的视图,还应用于后面的视图。此外,背后视图中的游标也会出现。这是同样的问题:NSView overlay passes mouse events to underlying subviews?但是那里的答案对我的项目不起作用,因为我无法打开另一个窗口。

感谢。

2 个答案:

答案 0 :(得分:13)

如果没有看到您的事件处理代码,很难知道发生了什么,但我怀疑您可能正在调用super在您的实现中实现各种事件处理方法。

NSViewNSResponder的子类,因此默认情况下,未处理的事件会在响应者链中传递。视图的超级视图是响应者链中的下一个对象,因此,如果您在[super mouseDown:event]的实现中调用‑mouseDown:,则该事件将被传递给超级视图。

此修复是为了确保您在事件处理程序中调用super的实现。

这是不正确的:

- (void)mouseDown:(NSEvent*)anEvent
{
    //do something
    [super mouseDown:event];
}

这是正确的:

- (void)mouseDown:(NSEvent*)anEvent
{
    //do something
}

答案 1 :(得分:2)

Rob的回答和Maz对该答案的评论解决了这个问题,但只是为了让它绝对明确。为了防止NSView将鼠标事件放到父节点上,必须实现空方法。

// NSResponder =========================================
- (void) mouseDown:(NSEvent*)event {}
- (void) mouseDragged:(NSEvent*)event {}
- (void) mouseUp:(NSEvent*)event {}