Пользовательское представление NSMenuItem не отвечает на keyEquivalent

Я установил пользовательский 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 при использовании настраиваемого представления?

Спасибо!


person strange    schedule 07.02.2011    source источник
comment
Я должен упомянуть, что в документе прямо говорится, что эквиваленты клавиатуры и выбор типа продолжают использовать эквивалент клавиши и заголовок как обычно. но это не похоже на правду.   -  person strange    schedule 08.02.2011


Ответы (1)


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

Мне удалось обойти проблему, создав подкласс 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];
}
person Crutt    schedule 18.02.2012
comment
Хм ... может сработать, но мне просто не кажется правильным, что вам пришлось создать подкласс NSApplication - это не то, как были разработаны или должны работать Cocoa и AppKit. - person Jay; 03.12.2012
comment
@Jay, мне нужно сделать то же самое, и ответ Крутта кажется единственным способом добиться этого. Не то чтобы я был более рад, чем вы, от необходимости настраивать параметры вне моего кода для его реализации. В любом случае, по соответствующей заметке: stackoverflow.com/questions/27144113/ < / а> - person original_username; 26.03.2015