Question

Je tente d'obtenir une vue animée affichée pendant un processus de recherche mais il ne semble jamais à l'affichage.

Ce que je suis en train de réaliser

  1. L'utilisateur clique sur le bouton de recherche une fois qu'ils sont entrés dans le texte dans un UISearchBar.
  2. Vous avez indiqué texte est déléguée à searchBarSearchButtonClicked.
  3. Afficher une « vue Occupé » qui est un UIView contenant un UIActivityIndicatorView pour indiquer la recherche est en cours.
  4. Effectuer une recherche qui communique avec un site Web.
  5. A la fin de recherche supprimer le "Voir Occupé".

Quel est le problème

Le processus de recherche fonctionne bien, en utilisant le débogueur je peux le voir passer par la fin de la fonction searchBarSearchButtonClicked mais le « Voir Occupé » n'apparaît. La recherche prend 2-3 secondes en théorie je devrais voir mon « Voir Occupé » pour les 2-3 apparaissent secondes.


Code de tentative 1 - Ajouter et supprimer le "Voir Occupé" du superview **

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {

 [activeSearchBar setShowsCancelButton:NO animated:YES];
 [activeSearchBar resignFirstResponder];
 [busyView activateSpinner]; //start the spinner spinning
 [self.view addSubview:busyView]; //show the BusyView

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];

 [busyView deactivateSpinner]; //Stop the spinner spinning
 [busyView removeFromSuperview]; //remove the BusyView
 [search release]; search = nil;

}

Résultats de la tentative 1 -. Il ne semble pas, si je commente la removeFromSuperview appeler la Voir Occupé reste sur l'écran


code Tentative 2 - en utilisant des animations

- (void)searchBarSearchButtonClicked:(UISearchBar *)activeSearchBar {



[activeSearchBar setShowsCancelButton:NO animated:YES]; 
 [activeSearchBar resignFirstResponder];

 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView activateSpinner]; //start spinning the spinner
 [self.view addSubview:busyView]; //show the busy view

 [UIView commitAnimations];

 Search *search = [[Search alloc]init];
 results = [search doSearch:activeSearchBar.text];


 [UIView beginAnimations:nil context:nil];
 [UIView setAnimationDuration:0];
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(animationDidStop)];

 [busyView deactivateSpinner]; //sets stops the spinner spinning
 [busyView removeFromSuperview]; //remove the view

 [UIView commitAnimations];
 [search release]; search = nil;
}

Résultats de tentative 2 - n'a pas vu le "Voir Occupé" apparaît

Était-ce utile?

La solution

Eh bien, voici ma solution:

  • Créer un singleton MyLoadingView de classe. Cette classe doit contenir des méthodes de statiques afficher et masquer.
  • Dans le constructeur de MyLoadingView vous devez créer manuellement une vue avec fond noir semi-transparent et activityview à l'intérieur de celui-ci. Placez ce point de vue en [[UIApplication sharedApplication] keyWindow]. Cacher.
  • invocation de [MyLoadingView show] apporte juste objet myLoadingView à l'avant dans le récipient de ce: [[[UIApplication sharedApplication] keyWindow] bringSubviewToFront:myLoadingViewSharedInstance];. De plus, ne pas oublier de commencer activityview animation.
  • [MyLoadingView hide] arrête l'animation activityview et peaux sharedInstanceView.

S'il vous plaît avis, que vous avez besoin d'invoquer [MyLoadingView show] dans un thread séparé.

Autres conseils

interface utilisateur change à Cocoa ne prennent effet que la prochaine fois que votre code retourne le contrôle à la boucle d'exécution. Tant que votre tâche de recherche fonctionne de manière synchrone sur le thread principal, il bloque l'exécution, y compris les mises à jour de l'interface utilisateur.

Vous devez exécuter la tâche de temps de manière asynchrone en arrière-plan. Il y a un certain nombre d'options pour ce (NSOperation, performSelectorInBackground:..., Grand Central Dispatch, ...).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top