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?

È stato utile?

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:?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top