Пользовательское представление NSMenuItem не отвечает на keyEquivalent - PullRequest
3 голосов
/ 08 февраля 2011

Я установил для NSView пользовательский NSMenuItem, чтобы сделать свой собственный рисунок и рендеринг. Однако «keyEquivalent», присвоенный NSMenuItem, похоже, не отвечает. Я понимаю, что рисование и обработка действий должны выполняться самостоятельно, но я не могу захватить запрос keyEquivalent независимо от того, что я делаю. Я попытался создать подклассы sendEvent NSApplication, но это не работает, поскольку мое приложение - NSStatusBarItem (LSUIElement), а события из NSEventTrackingRunLoopMode (когда меню выключено) не достигают sendEvent NSApplication.

Тогда я попробовал использовать:

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

Это также не работает, так как никогда не вызывается, хотя я установил делегат главного меню на контроллер.

Кто-нибудь имеет представление о том, как захватывать события 'keyEquivalent' в NSMenuItems при использовании настраиваемого представления?

Спасибо!

1 Ответ

1 голос
/ 19 февраля 2012

Я знаю, что это старый пост, и вы, вероятно, давно зашли, но у меня была та же проблема, и я несколько раз сталкивался с вашим постом, когда пытался найти решение, поэтому я решил поделиться тем, что сработало для меня.

Мне удалось обойти эту проблему путем создания подкласса NSApplication и переопределения sendEvent.Вы упомянули, что пытались сделать это безуспешно, поэтому я не знаю, в чем разница, но у меня не было проблем с перехватом событий из NSMenu в NSStatusBarItem.Все мои ключевые эквиваленты - целые, поэтому я проверяю ключи, нахожу соответствующий элемент и затем явно вызываю действие 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];
}
...