2010-05-27 7 views
3

J'ai un problème concernant UIActivityIndicator. J'ai appliqué [spinner startAnimating] à l'IBAction sur un bouton et ensuite faire un certain processus. Après le processus, l'indicateur d'activité doit être arrêté, puis naviguer vers une autre vue. Mais l'indicateur d'activité n'apparaît pas. Lorsque je supprime la ligne "[spinner stopAnimating]", l'indicateur apparaît mais pas au moment où le bouton est pressé. Il apparaît juste avant que l'autre vue se charge, et n'apparaît apparemment pas, je veux dire qu'elle n'apparaît pas mais si on voit très attentivement alors seulement elle apparaît pour un instant.UIActivityIndicator ne fonctionne pas correctement?

Merci d'avance pour toute réponse.

Répondre

11

Ole est à peu près correct, mais il y a une astuce qui ne vous dérange pas le traitement synchrone (souvent c'est pourquoi vous voulez afficher l'indicateur d'activité en premier lieu).

Déplacez d'abord le code que vous voulez traiter pendant que le spinner est à sa propre méthode. Ensuite, faites

[spinner startAnimating]; 
[self performSelector:@selector(methodname) withObject:nil afterDelay:0]; 

Le paramètre afterDelay: 0 signifie la prochaine fois que la boucle d'exécution est exécutée. De cette façon, le fileur commence.

+0

Oh et Ole ont également raison lorsqu'il vous suggère de revenir sur vos questions précédentes et d'accepter (cliquez sur la coche) les bonnes! – Andiih

+0

En fait, mon code est quelque chose comme ceci: - (IBAction) buttonPressed: (id) expéditeur { [spinner startAnimating]; if (condition) { [self presentModalViewController: aView animé: oui]; [spinner stopAnimating]; } } – Jack

+0

alors déplacez votre arrêt if, self present et spinner vers une méthode et appelez cela avec performSelector: WithObject: afterDelay: 0 – Andiih

4

L'animation ne démarre pas tant que votre code n'a pas renvoyé le contrôle à la boucle d'exécution. Si votre tâche de traitement bloque le thread principal, les mises à jour sans interface utilisateur auront lieu jusqu'à ce qu'elle soit terminée. Vous devez effectuer votre traitement de manière asynchrone (par exemple en démarrant un NSOperation).

4

vous devez exécuter dans le sélecteur effectuer.

Ex:

[self performSelector:@selector(animation) withObject:nil afterDelay:0] 

-(void)animation 

{ 

NSAutoreleasepool *pool = [[NSAutorepleasepool alloc]init]; 

[indicatorView startAnimating]; 

[pool release]; 

} 
0

Ceci est une vieille question. Je laisse ma réponse here, ce qui pourrait aider quelqu'un à résoudre leur problème.

Questions connexes