【问题标题】:Mouse Events Bleeding Through NSView通过 NSView 流血的鼠标事件
【发布时间】:2011-09-29 06:21:39
【问题描述】:

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

【问题讨论】:

  • 请为您的最顶层视图发布事件处理代码。

标签: cocoa nsview nsevent


【解决方案1】:

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

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

解决方法是确保您不要在事件处理程序中调用super 的实现。

这是不正确的:

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

这是正确的:

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

【讨论】:

  • 这是我的问题,除了我需要实现鼠标拖动、光标更新和鼠标向上的空方法,因为我已经实现了鼠标向下。但是,哪个事件处理更改光标?
  • 只需使用-mouseEntered:-mouseExited: 并在这些方法中设置光标。
  • 这很有帮助。修复了我的子视图问题。谢谢!
  • 这只会禁用点击。如果您在下面的视图中有一个 NSTextField 并设置了第一响应者,那么鼠标光标似乎仍会变为光束。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多