Utilizzando NSProgressIndicator all'interno di un NSMenuItem
-
10-10-2019 - |
Domanda
Sto cercando di usare un NSProgressIndicator (indeterminato) all'interno di una barra di stato-menu. Sto utilizzando un NSView-oggetto come vista per il menuitem, e quindi subviews l'indicatore di avanzamento per visualizzarlo. Ma ogni volta che provo a chiamare lo startAnimation: per il progresso, non succede nulla. Quando provo fare la stessa cosa su un normale NSWindow funziona perfettamente, non solo quando all'interno di un menuitem.
Sono nuovo di entrambi cacao e Objective-C quindi potrei aver trascurato qualcosa "ovvio", ma ho cercato un po 'per una soluzione, ma senza successo. Ho trovato qualcosa su menuitems cant essere aggiornato mentre dimostrato e che è necessario utilizzare una finestra bordeless invece. Ma io non sono stato in grado di confermare questo in tutta la documentazione.
Modifica:
Ok, quasi ora funziona. Quando si utilizza il setUsesThreadedAnimation: e da menuWillOpen di un MenuDelegate e la creazione di 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:
(ancora utilizzando un nuovo thread), non funziona mai. Non setUsesThreadedAnimation:
rendere il progresso barra creare è proprio thread per l'animazione?
Soluzione
Risolto esso utilizzando:
[progressIndicator performSelector:@selector(startAnimation:)
withObject:self
afterDelay:0.0
inModes:[NSArray
arrayWithObject:NSEventTrackingRunLoopMode]];
All'interno della menuWillOpen :, il problema sembra essere stato chiamare startAnimation:. Prima della progressbar era finito disegno stesso
Altri suggerimenti
Come si fa riferimento l'NSProgressIndicator
che è nella vista (e quello nella finestra, è per questo)? Per esempio, avete una classe controller che ha fino ad uncino del IBOutlet
agli indicatori di progresso? Se si utilizza un IBOutlet
, stai sicuro che sia collegato correttamente nel file pennino?
Inoltre, dove e quando stai chiamando startAnimation:
? (Abbiamo bisogno di vedere un po 'di codice).
Una cosa che a volte può accadere è che si dimentica di collegare un IBOutlet
nel pennino. Poi, quando si tenta di dire l'oggetto di fare qualcosa nel codice in fase di esecuzione, il IBOutlet
è nil
, e quindi ciò che si pensa è un messaggio che viene inviato al tuo oggetto è in realtà, un messaggio inviato alla nil
. In altre parole, è solo ignorato, e sembra efficace come esso non funziona.
A condizione che si hanno una (potenzialmente) valido riferimento all'oggetto dell'interfaccia utente, l'altro problema comune che vedrete è quando uno sviluppatore sta cercando di inviare un messaggio con l'oggetto a "troppo presto" di un tempo. In generale, i metodi init
sono troppo presto nel corso della vita del oggetto controller per essere in grado di inviare messaggi a interfaccia utente oggetti, quelle di IBOutlet
sono ancora nil
. Con il tempo -awakeFromNib
si chiama, di IBOutlet
dovrebbero essere validi (purché li collegato in IB) e si può quindi inviare il messaggio con l'oggetto UI.
Hai detto che per utilizzare l'animazione filettato via -setUsesThreadedAnimation:?