2012-02-20 22 views
14

He subclase NSMenu y he conectado un montón de NSMenuItem a través de Interface Builder. He probado a través del depurador para ver si realmente se inicializaron.Parece que no puede setEnabled: NO en NSMenuItem

El menú está configurado para no habilitar elementos automáticamente. Sin embargo, cuando configuro cualquiera de mis NSMenuItem's en [myMenuItem setEnabled:NO], continúan habilitados. Incluso si llamo al [self update] desde dentro de la subclase NSMenu.

¿Qué me estoy perdiendo?

+0

Oiga, publique su solución como respuesta, y luego puede aceptarla en un par de días. – paulmelnikow

Respuesta

12

Lo resolví con la ayuda de un colega, así que lo publico aquí para otros que experimenten el mismo problema.

Debe configurar su NSMenu-sublass para habilitar automáticamente los elementos (comportamiento predeterminado) y luego implementar este método en NSMenu-sublass.

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

Intente llamar a [myMenuItem setEnabled:NO] desde un lugar diferente y asegúrese de que suceda después de que se cargue la punta del menú. Tal vez hacerlo bien en el NSMenu subclasificado awakeFromNib.

+0

Hice som pruebas rápidas y veo que awakeFromNib siempre se ejecuta antes de '[myMenuItem setEnabled: NO]'. Como sugirió, intenté actualizar el elemento del menú dentro de 'awakeFromNib', pero tampoco tuvo efecto. – Christoffer

4

Puede resolver este problema sin crear subclases.

Si tan sólo lo que necesita es menú estándar + algunas personalizados NSMenuItem s que se pueden desactivar en su control, lo que puede simplemente:

1) Añadir un nodo más menú - sólo tienes que arrastrar & gota Submenú Elemento desde la biblioteca de objetos a tu menú.

2) Agregue todos los NSMenuItems que desee administrar a este nuevo nodo de Menú.

3) Atributos abierto inspector para el nodo nuevo menú, y apagar automática permite Artículos opción:

http://i.imgur.com/YLZKFam.jpg (por favor, vea la imagen aquí, no puedo publicar directamente ahora).

4) configure otras opciones de su menú & elementos.

Ahora usted puede escribir un código como:

@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem; 
... 
[self.hidePlateMenuItem setEnabled:NO]; 

y Wil funciona bien.

43

Tuve el mismo problema, así que pensé en publicar mi solución. NSMenu auto habilita NSMenuButtons, por lo que debemos anularlo.

En IB:

You should uncheck "Auto Enables Items"

o mediante programación:

// Disable auto enable 
[myMenu setAutoenablesItems:NO]; 

// Test it 
[myMenuButton setEnabled:NO]; 
[myMenuButton setEnabled:YES]; 
+0

¡Alguien le dé puntos a este hombre! – Shizam

0

He intentado todas estas soluciones, pero finalmente encontré el verdadero problema que también hacen más sentido para mí. También es la forma más simple de manejar nsmenuitem deshabilitado que no necesita subclasificar ni codificar. El nsmenuitem antes de ser hijo del menú es hijo del elemento principal, por ejemplo, "Guardar como ..." es hijo de "Archivo".Solo seleccione el elemento principal (en este ejemplo es Archivo) y active "elementos de menú de activación automática" en el panel de menú del menú, ¡y listo!

2

Añadiendo a la respuesta de itsdavyh, si el elemento de menú está ubicado dentro de uno o más submenús, solo tiene que desmarcar la propiedad 'Autohabilita elementos' en el submenú del elemento de menú y no en otros pares principales.

2

enter image description here

debe desmarcar automática permite Artículos en el padre más cercano NSMenu

0

Swift 3 respuesta:

que tienen un elemento de submenú en el menú estándar "Vista" llamada " Habilite la configuración del sistema al iniciar ". Uso la función a continuación para activar o desactivar el elemento del menú. Nota: el menú de vista necesita que los "Elementos de habilitación automática" en IB se apaguen.

func enableSystemSetupMenuItem(enabled:Bool) { 
    //set view menu item to enabled: value 
    //requires "Auto Enable Items" of "View" menu item to be turned off in IB 
    //because "View" menu is now turned off for "Auto Enable" we have to handle all 
    //of the "View" menu items ourselves 
    //just to avoid operating on menu separators I set all other menu items to TAG = -1 
    let main = NSApplication.shared().menu?.item(withTitle: "View") 
    let subMenuItems = main?.submenu?.items 
    for item in subMenuItems! { 
     if item.title == "Enable System Setup On Launch" { 
      item.isEnabled = enabled 
     } else if item.tag == -1 { 
      item.isEnabled = true 
     } 
    } 
} 
Cuestiones relacionadas