cocoa - Parece que no se puede establecer: NO en NSMenuItem
(8)
NSMenu
y conecté un montón de NSMenuItem
''s a través de Interface Builder. He probado a través del depurador para ver si realmente se inicializan.
El menú está configurado para no habilitar automáticamente los elementos. Aún cuando configuro cualquiera de mis NSMenuItem''s en [myMenuItem setEnabled:NO]
continúan habilitados. Incluso si llamo a [self update]
desde dentro de la subclase NSMenu.
¿Qué me estoy perdiendo?
Agregando 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 ''Auto habilitar elementos'' en el submenú del elemento de menú y no en ningún otro menú principal.
Intente llamar a [myMenuItem setEnabled:NO]
desde un lugar diferente y asegúrese de que suceda después de que se haya cargado la plumilla que contiene el menú. Tal vez hacerlo bien en la subclase NSMenu''s awakeFromNib
.
Lo resolví con la ayuda de un colega, así que lo publico aquí para otros que experimentan el mismo problema.
Debe configurar su NSMenu-sublass para habilitar automáticamente los elementos (comportamiento predeterminado) y luego implementar este método en el NSMenu-sublass.
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return [menuItem isEnabled];
}
Probé todas estas soluciones, pero finalmente encontré el problema real que también tiene más sentido para mí. También es la forma más sencilla de manejar nsmenuitem deshabilitado que no necesita subclasificar ni codificar. El nsmenuitem antes de ser hijo del menú en sí es hijo del elemento principal, por ejemplo, "Guardar como ..." es hijo de "Archivo". Simplemente seleccione el elemento principal (en este ejemplo es Archivo) y desactive la opción "activar automáticamente los elementos del menú" en el panel de menú del menú, ¡y aquí está!
Puedes resolver este problema sin subclasificar.
Si solo necesita un menú estándar + algunos NSMenuItem
personalizados que se pueden desactivar en su control, entonces puede:
1) Agregue un nodo de menú más: simplemente arrastre y suelte el Elemento de menú del submenú de la biblioteca de objetos a su menú.
2) Agregue todos los NSMenuItems que desea administrar a este nuevo nodo de Menú.
3) Abra el inspector de atributos para su nuevo nodo de menú y desactive la opción Activar elementos automáticamente:
http://i.imgur.com/YLZKFam.jpg (por favor, vea la imagen aquí, no puedo publicarlo directamente ahora).
4) configure otras opciones de su menú y elementos.
Ahora puedes escribir un código como:
@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];
y funcionará bien.
Respuesta de Swift 3:
Tengo un elemento de submenú en el menú estándar "Ver" llamado "Habilitar configuración del sistema al iniciar". Utilizo la siguiente función para habilitar o deshabilitar el elemento del menú. Nota: el menú de visualización necesita que los "Elementos de Habilitación Automática" en IB estén desactivados.
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
}
}
}
Tenía el mismo problema, así que pensé en publicar mi solución. NSMenu auto habilita NSMenuButtons, por lo que debemos anularlo.
En IB:
O programáticamente:
// Disable auto enable
[myMenu setAutoenablesItems:NO];
// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];