首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSMenuItem中的自定义NSView不接收鼠标事件

NSMenuItem中的自定义NSView不接收鼠标事件
EN

Stack Overflow用户
提问于 2009-09-08 18:31:48
回答 7查看 5.4K关注 0票数 9

我使用popUpStatusItemMenu从NSStatusItem中弹出一个NSMenu。这些NSMenuItems显示了一堆不同的链接,每个链接都通过setAction: to目标的openLink:方法连接。这种安排在很长一段时间内一直运行良好。用户从菜单中选择一个链接,然后使用openLink:方法处理它。

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

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

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

代码语言:javascript
运行
复制
- (void)mouseUp:(NSEvent *)theEvent {
  NSLog(@"in mouseUp");
  }

没有骰子!此方法永远不会调用。

不过,我可以设置跟踪rects并接收mouseEntered: events。我在我的mouseEntered例程中添加了一些测试,如下所示:

代码语言:javascript
运行
复制
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");  }

并得到了以下响应:

代码语言:javascript
运行
复制
not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow

这就是问题所在吗?“不是isKeyWindow"?大概这并不好,因为苹果的文档说:“如果用户点击了一个不在键窗口中的视图,默认情况下,该窗口会被前移并成为键,但不会调度鼠标事件。”但是一定有一种方法可以检测到这些事件。多么?

添加:

代码语言:javascript
运行
复制
[[self window] makeKeyWindow];

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

EN

回答 7

Stack Overflow用户

发布于 2010-08-07 16:45:55

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

代码语言:javascript
运行
复制
- (void)mouseUp:(NSEvent*) event {
    NSMenuItem* mitem = [self enclosingMenuItem];
    NSMenu* m = [mitem menu];
    [m cancelTracking];
    [m performActionForItemAtIndex: [m indexOfItem: mitem]];
}

但是我在按键处理方面有问题,如果你解决了这个问题,也许你可以去我的问题,并帮助我一点。

票数 15
EN

Stack Overflow用户

发布于 2010-02-10 03:57:26

将此代码添加到您的自定义视图中,就可以了:

代码语言:javascript
运行
复制
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
    return YES;
}
票数 10
EN

Stack Overflow用户

发布于 2010-03-13 13:56:57

我将这个方法添加到我的自定义视图中,现在一切都运行得很好:

代码语言:javascript
运行
复制
- (void)viewDidMoveToWindow {
    [[self window] becomeKeyWindow];
}

希望这能有所帮助!

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1395556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档