2011-02-02 6 views
6

Tengo un menú con varios elementos creados en el generador de interfaz. Se ve bien allí y 'habilitado' está marcado.
Pero cuando ejecuto la aplicación, todos los elementos del menú aparecen atenuados.elemento de menú está habilitado, pero todavía en gris

He comprobado isEnabled, se cumple.

Además, los elementos de menú creados mediante programación (con initWithTitle y sin el constructor de interfaz) funcionan bien.

¿Falta algo aquí? Soy bastante nuevo en el desarrollo de OSX (de hecho, este es mi primer día).
Gracias

Respuesta

7

En caso de que alguien podría google esto y beneficios, el método de 'acción' fue declarado sin :(id)sender parámetro:

-(IBAction) quit; 

Extrañamente, setAction método en NSMenuItem lo comió y no se quejó. Oh bien.

+0

Si pasó 'quit' como selector de acciones, esperaba que eso funcionara. Si pasó 'quit:', es por eso que: 'quit:' es un método diferente del método 'quit' (no': ') que implementó. 'quit',' quit: ',' ​​quit :: ', y' quit: inAHuff: 'son todos diferentes selectores. –

3

Ah, la plaga de utilizar NSMenu ...

Salida <NSMenuValidation>.

Por lo general, la aplicación será tan simple como:

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { 
    return [menuItem isEnabled]; 
} 
+0

Gracias! Con algunos ajustes, he rastreado la causa raíz yo mismo, pero +1 para la información útil. –

+2

No creo que esto satisfaga el elemento del menú si el objetivo no responde a la acción. –

10

Recuerde que debe establecer la meta de su elemento de menú:

menuItem.target = self; 
  • Si el objetivo de la opción del menú aparece, a continuación, comprueba en primer lugar NSMenu para ver si ese objeto implementa método de acción de dicho elemento. Si no es así, entonces el artículo está deshabilitado. Si el objetivo implementa el método de acción del elemento, NSMenu primero verifica si ese objeto implementa validateMenuItem: o validateUserInterfaceItem: method. Si no es así, entonces el elemento del menú está habilitado. Si lo hace, entonces el estado habilitado de la opción del menú está determinado por el valor de retorno del método.

  • Si el objetivo del elemento de menú no está establecido y el objeto NSMenu no es un menú contextual, NSMenu utiliza la cadena de respuesta para determinar el destino. Si no hay ningún objeto en la cadena de respuesta que implementa la acción del elemento, el elemento está deshabilitado.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html

+2

¡Gracias, buen consejo! – Morkrom

+0

El objetivo es el primer respondedor (establecido en IB mediante el control arrastrando desde el elemento de menú al objeto proxy de primer respondedor). La acción está en el controlador de vista que hoy se supone que está en la cadena de respuesta. Todavía en gris. ¿Algunas ideas? – wcochran

Cuestiones relacionadas