我有一个NSView,它涵盖了父窗口的内容视图。此视图具有单击事件处理程序,可将其从内容视图中删除。在这个视图中,我有另一种观点。当我在此内部视图中拖动鼠标时,鼠标事件不仅应用于前面的视图,还应用于后面的视图。此外,背后视图中的游标也会出现。这是同样的问题:NSView overlay passes mouse events to underlying subviews?但是那里的答案对我的项目不起作用,因为我无法打开另一个窗口。
感谢。
答案 0 :(得分:13)
如果没有看到您的事件处理代码,很难知道发生了什么,但我怀疑您可能正在调用super
在您的实现中实现各种事件处理方法。
NSView
是NSResponder
的子类,因此默认情况下,未处理的事件会在响应者链中传递。视图的超级视图是响应者链中的下一个对象,因此,如果您在[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 {}