2011-01-12 12 views
6

Sto tentando di utilizzare NSProgressIndicator (indeterminato) all'interno di un menu di stato. Sto usando un oggetto NSView come vista per il menu, e poi sottoview l'indicatore di progresso per visualizzarlo. Ma ogni volta che provo a chiamare lo startAnimation: per il progresso, non succede nulla. Quando provo a fare la stessa cosa su una normale NSWindow funziona perfettamente, ma non quando si trova all'interno di un menu.Utilizzo di NSProgressIndicator all'interno di NSMenuItem

Sono nuovo sia per il cacao che per l'obiettivo-c, quindi potrei aver trascurato qualcosa di "ovvio", ma ho cercato un po 'per una soluzione ma senza successo. Ho trovato qualcosa su menuitems non può essere aggiornato mentre mostrato e che è necessario utilizzare una finestra senza bordo, invece. Ma non sono stato in grado di confermarlo in alcuna documentazione.

Modifica:

Ok, quasi funziona ora. Quando si utilizza setUsesThreadedAnimation: e dal menu MenuDelegateWillOpen e si crea un nuovo thread. Questo thread gestisce un metodo locale:

-(void) doWork(NSProgressIndicator*) p{ 
    [p startAnimation:self]; 
} 

Verrà avviata la progressindicator in modo casuale quando si apre il menu (?). Se chiamo startAnimation: direttamente senza passare attraverso doWork: (usando ancora un nuovo thread), non funziona mai. setUsesThreadedAnimation: non crea la barra di avanzamento per creare il proprio thread per l'animazione?

risposta

16

risolto utilizzando:

[progressIndicator performSelector:@selector(startAnimation:) 
          withObject:self 
          afterDelay:0.0 
           inModes:[NSArray 
         arrayWithObject:NSEventTrackingRunLoopMode]]; 

All'interno della menuWillOpen :, il problema sembra essere stata chiamata startAnimation: prima che il progressbar era finito disegno stesso.

+0

Grazie mille per quel consiglio, aiuta davvero! – Yojik

+0

Pazzo per quanto tempo ho cercato di fare questo lavoro, grazie mille! – Jasper

+0

Grazie amico! Grazie amico! Grazie amico! –

0

Hai detto di utilizzare l'animazione con thread tramite -setUsesThreadedAnimation :?

+0

Sì, non sembra essere d'aiuto. – Henrik

1

Come si fa riferimento allo NSProgressIndicator che si trova nella vista (e quello nella finestra, del resto)? Ad esempio, hai una classe controller che ha il IBOutlet collegato agli indicatori di avanzamento? Se stai usando un IBOutlet, sei sicuro che sia collegato correttamente nel file pennino?

Inoltre, dove e quando si chiama startAnimation:? (Dobbiamo vedere un po 'di codice).

Una cosa che può talvolta accadere è che si dimentica di collegare un pennino IBOutlet nel pennino. Quindi, quando si tenta di dire all'oggetto di fare qualcosa in codice durante il runtime, lo IBOutlet è nil, e quindi quello che si pensa sia un messaggio inviato al proprio oggetto è in realtà un messaggio inviato a nil. In altre parole, è semplicemente ignorato e sembra effettivamente che non funzioni.

A condizione che si abbia un riferimento (potenzialmente) valido all'oggetto UI, l'altro problema comune che si vedrà è quando uno sviluppatore sta tentando di inviare un messaggio all'oggetto "troppo presto" di una volta. In generale, i metodi init sono troppo precoci nella vita dell'oggetto del controllore per poter inviare messaggi agli oggetti dell'interfaccia utente, quelli IBOutlet sono ancora nil. Quando viene chiamato il numero -awakeFromNib, è necessario che gli ID IBOutlet siano validi (a condizione che siano stati collegati in IB) e quindi è possibile inviare il messaggio all'oggetto dell'interfaccia utente.

+0

Buoni punti, questo spiega perché a volte ho avuto dei valori nulli quando ho cercato di raggiungere i componenti della presa (chiamandoli troppo presto). Ora mi è sembrato di ridurlo a un problema di disegno.L'ho reso animato quando il menu che contiene la vista è evidenziato (nella mia vista drawRect :), e poi lo fa smettere quando non è più evidenziato. Ma se provo a renderlo animato al di fuori della clausola if che controlla se l'elemento è evidenziato, non succede nulla (ancora dentro drawRect :). – Henrik

+0

Sono riuscito a farlo funzionare un po 'di più, sembra che ho dovuto inviare stopAnimation: qualche tempo prima di fare startAnimation: lavoro. Ma voglio che si animi (o meno) quando viene visualizzato il menu. Attualmente devo passare il mouse sopra la vista per iniziare, quando viene visualizzato il menu mostra solo la barra di avanzamento che non si anima, anche se dovrebbe essere nascosta quando non (setDisplayWhenStopped: NO). Per continuare nel prossimo commento ... – Henrik

+0

E non riesco ancora a farlo funzionare quando lo si chiama dall'esterno dell'oggetto view, ad es. navigando attraverso le sottoview del NSMenu nella sua classe controller. Sembra che ci debba essere una sorta di evento quando il menu viene visualizzato affinché l'animazione funzioni. – Henrik

Problemi correlati