2010-04-09 9 views
6

Tengo un NSMenu que contiene NSMenuItems con vistas personalizadas. Lo quiero para que cuando se presiona el botón alt, los elementos del menú cambien parte de su aspecto (a través de su vista). Encontré setAlternative en los documentos NSMenuItem, sin embargo, en la práctica solo pude hacer que funcionara con NSMenuItems sin vistas personalizadas. Tan pronto como establezca una vista personalizada, se mostrarán todos los elementos del menú. Además, traté de obtener eventos de pulsación de tecla mientras el menú estaba abierto. Debido al otro ciclo de ejecución, NSApplication's sendEvent: no recibe eventos hasta que se cierra el menú. Por lo tanto, no puedo simplemente interceptar el evento que entra.Elementos de menú alternativos en NSMenu

¿Alguien sabe cómo puedo recibir notificaciones, ya sea por delegación o subclases, de cuando se presiona la tecla alt cuando se abre un menú?

Respuesta

6

Debe establecer un objeto como el delegado de su menú y luego implementar el método delegado -menu:updateItem:atIndex:shouldCancel:.

Esto le permitirá cambiar el estado de su vista personalizada antes de que se muestre el elemento del menú, en función del estado actual del modificador.

Puede obtener los modificadores actuales solicitando [[NSApp currentEvent] modifierFlags].

Si tiene que ser notificado si las banderas modificadores cambian mientras el menú está abierto, poner en práctica el método -flagsChanged: en la vista personalizada:

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

Necesito que suceda cuando el menú está abierto. Al igual que, no cuando se abre el menú, pero mientras está abierto, si el usuario hace clic con alt, entonces necesito una notificación. –

+0

He actualizado la respuesta con información sobre el método '-flagsChanged'. –

+0

Anulo - (BOOL) acceptFirstResponder y - (BOOL) becomeFirstResponder para devolver YES en las clases de vista personalizadas de mis NSMenuItems. Luego implementé flagsChanged :. Hice la primera respuesta de la primera opción del menú cuando menuNeedsUpdate: Sin embargo, flagsChanged: no se llama todavía. También intenté que se convirtiera en respondedor después de un retraso de 0.5 (en el modo de ciclo de eventos de seguimiento), en caso de que el menú lo robe de alguna manera. Eso tampoco funcionó. ¿Algunas ideas? –

Cuestiones relacionadas