2010-04-09 1 views
6

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

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

ответ

6

Вы должны установить объект в качестве делегата вашего меню, а затем реализовать метод делегирования -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 
    } 
} 
+0

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

+0

Я обновил ответ с информацией о методе '-flagsChanged'. –

+0

I overrode - (BOOL) принимает FirstResponder и - (BOOL) становится FirstResponder, чтобы возвращать YES в пользовательских классах просмотра моих NSMenuItems. Затем я реализовал flagsChanged :. Я сделал первый ответ первого элемента меню, когда menuNeedsUpdate: Тем не менее, flagsChanged: не получает вызов еще. Я также попробовал, чтобы он стал ответчиком после задержки 0,5 (в режиме цикла событий отслеживания), если каким-то образом меню украло его. Это тоже не сработало. Есть идеи? –