Альтернативные пункты меню в NSMenu - PullRequest
7 голосов
/ 09 апреля 2010

У меня есть NSMenu, который содержит NSMenuItems с пользовательскими представлениями. Я хочу, чтобы при нажатии кнопки alt пункты меню меняли часть своего внешнего вида (через их вид). Я нашел setAlternative в NSMenuItem документах, однако на практике я мог заставить его работать только с NSMenuItems без пользовательских представлений. Как только я установлю пользовательский вид, будут отображены все пункты меню. Кроме того, я пытался получать события нажатия клавиш, когда меню было открыто. Из-за другого цикла выполнения, NSApplication's sendEvent: не получает события, пока не закроется меню. Поэтому я не могу просто перехватить входящее событие.

Кто-нибудь знает, как я могу получить уведомление, посредством делегирования или подкласса, о том, когда клавиша alt нажата при открытии меню?

1 Ответ

6 голосов
/ 10 апреля 2010

Вы должны установить объект в качестве делегата вашего меню, а затем реализовать метод делегата -menu:updateItem:atIndex:shouldCancel:.

Это позволит вам изменить состояние пользовательского представления перед отображением элемента меню в зависимости от текущего состояния модификатора.

Вы можете получить текущие модификаторы, запросив [[NSApp currentEvent] modifierFlags].

Если вам необходимо получить уведомление об изменении флагов модификатора при открытом меню, внедрите метод -flagsChanged: в своем пользовательском представлении:

- (void)flagsChanged:(NSEvent*)event
{
    if ([event modifierFlags] & NSAlternateKeyMask)  // check for option key
    {
        //do something
    }
    else
    {
        //do something else
    }
}
...