NSMenuItem自定义视图不响应keyEquivalent

时间:2011-02-07 23:59:53

标签: cocoa xcode nsview nsmenuitem

我已将自定义NSView设置为NSMenuItem以进行自己的绘图和渲染。但是,分配给NSMenuItem的“keyEquivalent”似乎没有响应。我理解绘图和动作处理需要自我处理,但无论我做什么,我似乎都无法捕获keyEquivalent请求。我已经尝试了子类化NSApplication的sendEvent,但由于我的应用程序是NSStatusBarItem(LSUIElement),并且来自NSEventTrackingRunLoopMode(当菜单关闭时)的事件未到达NSApplication的sendEvent,因此无效。

然后我尝试使用:

- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event target:(id *)target action:(SEL *)action

这不起作用,因为即使我已将主菜单的委托设置为控制器,也从未调用过。

在使用自定义视图时,有没有人知道如何在NSMenuItems上捕获'keyEquivalent'事件?

谢谢!

1 个答案:

答案 0 :(得分:1)

我知道这是一篇很老的帖子,你可能已经很久了,但是我遇到了同样的问题并且在尝试寻找解决方案时多次遇到你的帖子,所以我想我会分享对我有用的东西。 / p>

我能够通过继承NSApplication并重写sendEvent来解决这个问题。你提到你尝试过这个没有成功,所以我不知道有什么不同,但我没有问题拦截来自NSStatusBarItem中的NSMenu的事件。我的关键等价物是所有的int,所以我验证了密钥,找到了合适的项目,然后显式地调用了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];
}