我已将自定义 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/

10-09 06:29