
不幸的是,我最近决定尝试使用NSMenuItem的setVIEw:方法来提供更好/更滑动的界面.基本上,我刚停止设置标题,创建了NSMenuItem,然后使用setVIEw:来显示自定义视图.这非常有效,菜单项看起来很棒,我的自定义视图也会显示出来.
但是,当用户选择菜单项并释放鼠标时,该 *** 作不再起作用(即,不调用openlink:).如果我只是简单地注释掉setVIEw:call,那么动作再次起作用(当然,菜单项是空白的,但动作正确执行).那么,我的第一个问题是为什么设置视图会破坏NSMenuItem的 *** 作.
没问题,我想,我会通过在我的自定义视图中检测mouseUp事件并从那里调用我的action方法来解决它.我将此方法添加到自定义视图中:
- (voID)mouseUp:(NSEvent *)theEvent { NSLog(@"in mouseUp"); } 没有骰子!永远不会调用此方法.
我可以设置跟踪rects并接收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 eventscanBecomeKeyWindownot isKeyWindow
这是问题吗? “not isKeyWindow”?据推测,这并不好,因为Apple的文档说“如果用户点击不在关键窗口中的视图,默认情况下窗口会被提前并变为密钥,但不会调度鼠标事件.”但必须有办法检测这些事件.怎么样?
添加:
[[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]];} 但是我遇到了关键 *** 作的问题,如果你解决了这个问题,也许你可以回答我的问题并帮助我一点点.
总结以上是内存溢出为你收集整理的cocoa – NSMenuItem中的自定义NSView未接收鼠标事件全部内容,希望文章能够帮你解决cocoa – NSMenuItem中的自定义NSView未接收鼠标事件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)