gpt4 book ai didi

cocoa - NSMenuItem 中的自定义 NSView 未接收鼠标事件

转载 作者:行者123 更新时间:2023-12-03 16:05:45 24 4
gpt4 key购买 nike

我使用 popUpStatusItemMenu 从 NSStatusItem 中弹出一个 NSMenu。这些 NSMenuItems 显示了一堆不同的链接,每个链接都通过 setAction: 连接到目标的 openLink: 方法。这种安排长期以来一直运作良好。用户从菜单中选择一个链接,然后 openLink: 方法对其进行处理。

不幸的是,我最近决定尝试使用 NSMenuItem 的 setView: 方法来提供更好/更流畅的界面。基本上,我只是停止设置标题,创建 NSMenuItem,然后使用 setView: 显示自定义 View 。这工作得很好,菜单项看起来很棒,并且显示了我的自定义 View 。

但是,当用户选择菜单项并释放鼠标时,该操作将不再起作用(即不调用 openLink: )。如果我只是简单地注释掉 setView: 调用,那么操作会再次起作用(当然,菜单项是空白的,但操作会正确执行)。那么,我的第一个问题是为什么设置 View 会破坏 NSMenuItem 的操作。

没问题,我想,我将通过检测自定义 View 中的 mouseUp 事件并从那里调用我的操作方法来修复它。我将此方法添加到我的自定义 View 中:

- (void)mouseUp:(NSEvent *)theEvent {
NSLog(@"in mouseUp");
}

没有骰子!这个方法永远不会被调用。

不过,我可以设置跟踪矩形并接收 mouseEntered: 事件。我在 mouseEntered 例程中进行了一些测试,如下所示:

if ([[self window] ignoresMouseEvents]) {  NSLog(@"ignoring mouse events");  }
else { NSLog(@"not ignoring mouse events"); }
if ([[self window] canBecomeKeyWindow]) { dNSLog((@"canBecomeKeyWindow")); }
else { NSLog(@"not canBecomeKeyWindow"); }
if ([[self window] isKeyWindow]) { dNSLog((@"isKeyWindow")); }
else { NSLog(@"not isKeyWindow"); }

并得到以下回复:

not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow

这是问题吗? “不是isKeyWindow”?大概这不好,因为苹果的文档说“如果用户单击不在关键窗口中的 View ,默认情况下该窗口会向前移动并成为关键,但不会调度鼠标事件。”但必须有一种方法可以检测这些事件。怎么做?

添加:

[[self window] makeKeyWindow];

尽管 canBecomeKeyWindow 为 YES,但没有任何效果。

最佳答案

将此方法添加到您的自定义 NSView 中,它将可以很好地处理鼠标事件

- (void)mouseUp:(NSEvent*) event {
NSMenuItem* mitem = [self enclosingMenuItem];
NSMenu* m = [mitem menu];
[m cancelTracking];
[m performActionForItemAtIndex: [m indexOfItem: mitem]];
}

但是我在 key 处理方面遇到了问题,如果您解决了这个问题,也许您可​​以转到我的问题并帮助我一点。

关于cocoa - NSMenuItem 中的自定义 NSView 未接收鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com