我已将自定义 NSView
设置为 NSMenuItem
以进行我自己的绘图和渲染。然而,分配给 NSMenuItem
的“keyEquivalent”似乎没有响应。我知道绘图和 Action 处理需要自行处理,但无论我做什么,我似乎都无法捕获 keyEquivalent 请求。我已经尝试对 NSApplication 的 sendEvent 进行子类化,但这不起作用,因为我的应用程序是 NSStatusBarItem
(LSUIElement) 并且来自 NSEventTrackingRunLoopMode
的事件(当菜单关闭时)没有到达 NSApplication 的 sendEvent。
然后我尝试使用:
- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event target:(id *)target action:(SEL *)action
这也不起作用,因为即使我已将主菜单的委托(delegate)设置为 Controller ,也永远不会调用它。
有没有人知道如何在使用自定义 View 时在 NSMenuItems 上捕获“keyEquivalent”事件?
谢谢!
最佳答案
我知道这是一篇旧帖子,您可能早就过了,但我遇到了同样的问题,并在尝试找到解决方案时多次遇到您的帖子,所以我想我会分享对我有用的内容。
我能够通过继承 NSApplication 和覆盖 sendEvent 来解决这个问题。你提到你尝试过但没有成功,所以我不知道有什么区别,但是我没有问题从 NSStatusBarItem 中的 NSMenu 拦截事件。我的键等价物都是整数,所以我验证键,找到合适的项目,然后显式调用 NSMenuItem 操作。
-(void)sendEvent:(NSEvent *)theEvent
{
if([theEvent type] == NSKeyUp){
NSInteger mod = ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask);
if(mod == NSCommandKeyMask) {
NSInteger keyEquiv = [[theEvent characters] isEqualToString:@"0"]
? 10
: [[theEvent characters] integerValue];
if(keyEquiv > 0) {
NSMenuItem *item = [[(MyAppDelegate *)[self delegate] myStatusMenu] itemAtIndex:(keyEquiv - 1)];
if([[item keyEquivalent] integerValue] == keyEquiv){
[[item target] performSelector:[item action] withObject:item];
}
}
}
}
[super sendEvent:theEvent];
}
关于cocoa - NSMenuItem 自定义 View 不响应 keyEquivalent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4928158/