11
votes

Animate Spinner lors du chargement de la nouvelle page

J'ai un UitailView qui d'un flux RSS externe.

Lorsque vous sélectionnez une ligne, il utilise NavigationController et glisse à partir de la droite, le problème est que le flux RSS contient donc quelques secondes pour charge et sans indication de ce qui se passe, vous pouvez la confondre pour un crash d'application.

J'ai décidé d'ajouter une fileuse afin que vous sachiez que la nouvelle page est chargée.

ici est mon code:

racineviewcontroller.m xxx

daysviewcontroller.m xxx

Il y en a deux problèmes avec ce code.

  1. Le spinner n'est pas actif qu'après la charge de la nouvelle page.
  2. Le spinner ne désactive pas une fois chargé.

    Si quelqu'un pouvait m'aider avec ce problème, je serais vraiment graticablement.


3 commentaires

Je pense que vous manquez toujours le code où la vue de l'indicateur d'activité est arrêtée / supprimée. Aussi: Comment chargez-vous les images? Si vous utilisez une méthode de blocage (c'est-à-dire une méthode qui ne fonctionne pas dans un fil d'arrière-plan), toute votre boucle principale sera bloquée, ce qui signifie: Aucune interaction utilisateur, aucune animation, etc. (qui expliquerait ce comportement). Si tel est le cas, vous devez vraiment passer au chargement asynchrone.


@Triphoenix Comment savez-vous s'il s'agit d'une méthode de blocage ou non? J'ai ajouté dans le code sur DétailsViewController.m


Vous pouvez dire être la façon dont la fonction fonctionne: les fonctions de blocage retourneront la valeur immédiatement, dans ce cas initwithcontentsofurl aura placé les données dans votre nsdata afin que le funciton ne puisse donc pas retourner avant avoir retourné ces données. Les demandes asynchrones sont plus complexes dans le sens où vous démarrez la demande et que vous n'aurez pas le résultat renvoyé, mais la demande appellera plutôt une fonction de rappel sur votre code lorsqu'elle est terminée. Il existe des cadres tels que ASIHTTPEQUEST qui faciliteront cela ou vous pouvez utiliser NsurlConnection et le faire par vous-même.


3 Réponses :


26
votes

Vous ajoutez la vue Indicateur d'activité à la vue du contrôleur qui appuie le contrôleur de vue détaillée, de sorte que vous ne le verrez pas quand même

Essayez de déplacer le deuxième groupe de code sur la méthode ViewDidLoad de DétailsViewController, vous pouvez appeler Stophanimant sur l'indicateur d'activité lorsque vous avez terminé le chargement. Pour obtenir une référence à l'uactivitéIndicator, vous devez ajouter une balise P>

E.g. Dans la vue ViewDidDload P>

[[self.view viewWithTag:12] stopAnimating];



3
votes

Vous devez faire du travail dans un fil d'arrière-plan. Si la ligne suivante est celle qui prend le temps: xxx

alors vous pouvez le faire en arrière-plan avec GCD: xxx

et +1 à @ wattson12 - Vous devez ajouter la spinner à la nouvelle vue à la place. Sinon, vous pouvez ajouter la fileuse à la vue actuelle et mettre le pushviewController dans votre bloc de file d'attente principal GCD.

point final - vous voulez supprimer le filateur Depuis sa superview une fois que vous l'avez empêché d'animation. Alternativement, vous pouvez avoir une seule instance de la spinner et définir Hideswhensplié à Oui.


0 commentaires

1
votes

Ceci est une roue de filage sur une vue floue à Swift: xxx


1 commentaires

J'ai utilisé cette méthode et ça fonctionne vraiment bien. Mais lorsque j'essaie d'arrêter l'animation en appelant bluview.removefromsuperview () il ne change rien. Aucun conseil?