【问题标题】:Weird issue with NSMenuItem, custom view and mouseUp:NSMenuItem、自定义视图和 mouseUp 的奇怪问题:
【发布时间】:2013-02-11 01:44:36
【问题描述】:

我在这里遇到了一个非常奇怪的 NSMenu 问题。

我使用的大约一半 NSMenuItems 通过 NSMenuItem 上的 setView: 方法对它们有自定义视图。在这个自定义视图中,我实现了 mouseUp: 来捕捉用户单击菜单项的时间,这在我第一次打开菜单时效果很好。

但第二次,如果我在单击时保持鼠标稳定,则不会在任何这些菜单项上调用 mouseUp。但是,如果我向下单击,然后稍微移动光标,然后释放 mouseUp 就会被调用。所以由于某种原因,有些东西正在拦截这些事件,但只有第二次出现菜单时,如果光标在 mouseDown 事件之后移动,它就会通过。 (由于某种原因,mouseDown 永远不会在菜单的第一次或第二次出现时被调用)。

有人知道这里可能发生了什么吗?是什么拦截了我的鼠标事件,为什么它们会在菜单第一次出现时传递给我的自定义视图,而在第二次出现时却没有?

【问题讨论】:

  • 如果我在第二次出现的菜单上双击(mouseUp 然后被调用两次)也会通过。
  • 所以我必须在这个视图之上使用 NSTextViews。那些正在变得mouseDown,但他们也开始与他们的superview同时失败。几乎就像在 NSMenu 之上有东西拦截了鼠标事件。

标签: objective-c macos cocoa nsmenuitem nsmenu


【解决方案1】:

我遇到了同样的问题。原来问题是我在第一次菜单点击后启动了一个外部应用程序,当菜单再次打开时,它的窗口不再是关键。将此方法添加到我在菜单项中使用的 NSView 子类解决了问题:

- (void)viewWillMoveToWindow:(NSWindow *)newWindow;
{
    [super viewWillMoveToWindow:newWindow];

    if ( newWindow != nil && ![newWindow isKeyWindow] )
        [newWindow becomeKeyWindow];

    [self updateTrackingAreas];
}

有关更多上下文,请查看此链接:http://openradar.appspot.com/7128269

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 2013-08-27
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多