2012-02-20 7 views
14

Ho sottoclasse NSMenu e collegato un gruppo di NSMenuItem tramite Interface Builder. Ho provato tramite il debugger per vedere che sono stati inizializzati veramente.Sembra impossibile impostare Enable: NO su NSMenuItem

Il menu è impostato per non attivare automaticamente le voci. Ancora quando ho impostato uno dei miei NSMenuItem su [myMenuItem setEnabled:NO] continuano ad essere abilitati. Anche se chiamo [self update] all'interno della sottoclasse NSMenu.

Cosa mi manca?

+0

Ehi, postare la soluzione come risposta, e quindi è possibile accettarlo in un paio di giorni. – paulmelnikow

risposta

12

L'ho risolto con l'aiuto di un collega, quindi lo postò qui per altri che hanno riscontrato lo stesso problema.

È necessario impostare NSMenu-sublass per abilitare automaticamente gli elementi (comportamento predefinito) e quindi implementare questo metodo nella sottolaccia NSMenu.

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

Provare a chiamare [myMenuItem setEnabled:NO] da un luogo diverso e assicurarsi che avvenga dopo il il pennino contenente il menu sia caricato. Forse lo fanno nel sottotitolo NSMenu awakeFromNib.

+0

Ho fatto dei test rapidi e vedo che awakeFromNib è sempre eseguito prima di '[myMenuItem setEnabled: NO]'. Come hai suggerito, ho provato ad aggiornare il menuItem all'interno di 'awakeFromNib', ma non ha avuto alcun effetto. – Christoffer

4

È possibile risolvere questo problema senza sottoclassi.

Se solo ciò che serve è menu standard + alcuni personalizzati NSMenuItem s che può essere attivato per il tuo controllo, che si può solo:

1) Aggiungere un altro nodo del menu - basta trascinare & goccia Sottomenu Menu Item dalla libreria Object al tuo menu.

2) Aggiungere tutti gli NSMenuItem che si desidera gestire a questo nuovo nodo Menu.

3) Aprire Attributi per il nodo Nuovo menu, e spegnere Auto Attiva opzione Articoli:

http://i.imgur.com/YLZKFam.jpg (per favore, vedi immagine qui, non riesco a postare direttamente ora).

4) configurare altre opzioni del menu & voci.

ora è possibile scrivere un codice come:

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

e wil funziona bene.

43

Aveva lo stesso problema, quindi ho pensato di pubblicare la mia soluzione. NSMenu auto abilita NSMenuButtons, quindi dobbiamo ignorarlo.

In IB:

You should uncheck "Auto Enables Items"

oa livello di programmazione:

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

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

Qualcuno ha dato a quest'uomo i suoi punti! – Shizam

0

Ho provato tutte queste soluzioni, ma alla fine ho trovato il vero problema che anche rendere più senso per me. È anche il modo più semplice per gestire nsmenuitem disabilitato che non necessita di sottoclasse o codice. Il nsmenuitem prima di essere figlio del menu stesso è figlio dell'elemento principale, ad esempio "Salva come ..." è figlio di "File".Basta selezionare la voce genitore (in questo esempio è File) e disattivare "voci di menu di abilitazione automatica" nel pannello del pannello di controllo, e qui si va!

2

In aggiunta alla risposta di itsdavyh, se la voce di menu si trova all'interno di uno o più sottomenu è sufficiente deselezionare la proprietà 'Auto attiva elementi' nel sottomenu della voce di menu e non in nessun altro parentmenus.

2

enter image description here

Si dovrebbe deselezionare Auto Consente Articoli sul più vicino genitore NSMenu

0

Swift 3 risposta:

Ho una voce di sottomenu sotto la "Vista" menu standard chiamato " Abilita l'installazione del sistema all'avvio ". Io uso la funzione qui sotto per abilitare o disabilitare la voce di menu. Nota: il menu di visualizzazione necessita di "Auto Enable Items" in IB per essere disattivato.

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 
     } 
    } 
} 
Problemi correlati