NSMenuItem、自定义视图和 mouseUp 的奇怪问题:

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

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

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

- (void)viewWillMoveToWindow:(NSWindow *)newWindow;

    [super viewWillMoveToWindow:newWindow];

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

    [self updateTrackingAreas];

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

【讨论】:

以上是关于NSMenuItem、自定义视图和 mouseUp 的奇怪问题:的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义视图的 NSMenuItem 在滚动时消失

NSMenuItem 自定义视图未更新

如何删除自定义视图上方的 NSMenuItem 间隙

单击后从 NSMenuItem 中删除突出显示?

如何在 NSMenuItem 的操作上设置发件人?

如何像 Apple Pro Apps 一样自定义 NSMenu?