2010-04-14 6 views
0

J'essaie de créer un indicateur d'activité dans l'application iPhone. Le problème est que je ne peux pas le faire apparaître avant que la tâche réelle que je veux que le diplay soit joué est déjà terminée. Y a-t-il quelque chose de funky dans la commande de l'iPhone?Comment puis-je faire apparaître instantanément un UIView?

Voici mon code problématique (dans mon délégué app):

-(BOOL)showProgressView: (NSString *) message { 
self.progress = [[UIView alloc] initWithFrame:window.frame]; 

UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"squircle.png"]]; 
[img setAlpha:0.5]; 
[img setFrame:CGRectMake(94, 173, 133, 133)]; 


UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(51.5, 51.5, 30, 30)]; 
spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 

[img addSubview:spinner]; 

[self.progress addSubview:img]; 


[spinner startAnimating]; 
[img release]; 
[spinner release]; 

[window addSubview:self.progress]; 

return YES; 

}

J'appelle alors ce code comme ceci:

if ([appDelegate showProgressView:@"Loading..:"]) 
{ 

    //My actual code loads data and stuff here but that is not important 
      //drawCtrl is a UIViewController subclass that is instantiated here 


    UINavigationController *navController = [appDelegate navigationController]; 
    [navController pushViewController:drawCtrl animated:YES]; 


    [drawCtrl release]; 
} 

Le problème est que mon indicateur d'activité n'apparaît pas tant que le nouveau contrôleur de vue n'est pas poussé dans la pile de navController. Puis-je contrôler cela d'une manière ou d'une autre?

Merci d'avance!

-Mats

Répondre

1

Vous devez appeler votre méthode de chargement périodiquement par une minuterie. Les modifications de l'interface utilisateur nécessitent un parcours dans la boucle d'événement pour être visibles. Je l'ai fait habituellement dans une minuterie que j'ai configurée dans AppDelegate, elle appelle le "methodThatTakesSomeTime" toutes les n secondes, la méthode "methodThatTakesSomeTime" fonctionne pour une tranche de temps spécifiée et se termine, ce qui est généralement le même que le minuteur temps de déclenchement. Cela donne à la boucle d'événement le temps d'actualiser l'interface utilisateur et donne également à votre méthode le temps de faire son travail.

Prend un peu de bidouillage en gardant l'état de la méthode "methodThatTakesSomeTime" afin qu'il puisse continuer son chemin, mais c'est ce qu'il faut.

Questions connexes