2011-02-02 18 views
6

Ho un menu con diversi elementi creati nel generatore di interfacce. Sembra bello lì e 'abilitato' è controllato.
Ma quando eseguo l'applicazione, tutte le voci di menu sono disattivate.è attivata, ma è ancora in grigio.

Ho controllato isEnabled, restituisce vero.

Inoltre, le voci di menu create a livello di codice (con initWithTitle e senza il generatore di interfaccia) funzionano correttamente.

Mi manca qualcosa qui? Sono davvero abbastanza nuovo per lo sviluppo di OSX (infatti, questo è il mio primo giorno).
Grazie

risposta

7

Nel caso in cui qualcuno potrebbe google questo fuori e benefici, il metodo di 'azione' stato dichiarato senza :(id)sender parametro:

-(IBAction) quit; 

Stranamente, setAction metodo in NSMenuItem lo mangiò e non si lamentò. Oh bene.

+0

Se hai passato 'quit' come selettore di azioni, mi sarei aspettato che funzionasse. Se hai passato 'quit:', ecco perché: 'quit:' è un metodo diverso dal metodo 'quit' (no': ') che hai implementato. 'quit',' esci: ',' ​​quit :: ', e' esci: inAHuff: 'sono tutti i selettori diversi. –

3

Ah, la peste di utilizzare NSMenu ...

Partenza <NSMenuValidation>.

Di solito l'attuazione sarà semplice come:

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

Grazie! Con alcuni giochini, ho rintracciato la causa principale, ma +1 per le informazioni utili. –

+2

Non penso che questo soddisferà la voce di menu se l'obiettivo non risponde all'azione. –

10

Ricordate di impostare bersaglio del vostro voce di menu:

menuItem.target = self; 
  • Se il target della voce di menu è impostata, allora NSMenu prime verifiche per vedere se questo oggetto implementa metodo di azione del prodotto. In caso contrario, l'elemento è disabilitato. Se il target implementa il metodo di azione dell'elemento, NSMenu prima controlla se quell'oggetto implementa validateMenuItem: o validateUserInterfaceItem: method. In caso contrario, la voce di menu è abilitata. In tal caso, lo stato abilitato della voce di menu è determinato dal valore di ritorno del metodo.

  • Se la destinazione della voce di menu non è impostata e l'oggetto NSMenu non è un menu contestuale, NSMenu utilizza la catena di risposta per determinare la destinazione. Se non c'è alcun oggetto nella catena di risposta che implementa l'azione dell'oggetto, l'elemento è disabilitato.

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

+2

Grazie, bel consiglio! – Morkrom

+0

Il target è il primo risponditore (impostato in IB dal controllo che trascina dalla voce di menu all'oggetto proxy del primo soccorritore). L'azione è nel controller di visualizzazione che oggi si suppone essere nella catena di risposta. Ancora in grigio. Qualche idea? – wcochran

Problemi correlati