Question

Je suis en train d'obtenir un UIActivityIndicatorView à « apparaître et animer » quand un utilisateur fait défiler vers le bas d'une UITableView ....

Après avoir atteint le bas de la vue de la table, une demande Web est faite que prendra quelques secondes pour terminer, puis le UIActivityIndicatorView devrait « arrêter et cacher »

Je déclenche l'apparition du UIActivityIndicatorView en utilisant tableView: willDisplayCell: forRowAtIndexPath:

Liste élément

Mais le problème est que le UIActivityIndicatorView ne figure pas sur l'écran de l'iPhone jusqu'à ce que l'ensemble de la méthode (c.-à-tableView: willDisplayCell: forRowAtIndexPath :) est appelé, et il est alors aussi déjà caché.

Toutes les idées sur comment:

  1. afficher la vue indicateur
  2. faire la demande web
  3. cacher la vue indicateur?

nouveau thread? mieux?

Merci !!

spécifiquement, ma fonction ressemble à ceci

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.results && indexPath.row == [self.results count] - 1) {
        [self.loadingSignal setHidden:NO]; // <====== my UIActivityIndicatorView is called "loadingSignal"
        [self.loadingSignal startAnimating];

    /// make web request that will take a few seconds

        [self.loadingSignal setHidden:YES];
        [self.loadingSignal stopAnimating];

        }
    }
}
Était-ce utile?

La solution

D'accord. A partir de votre extrait ci-dessus de code, je vois quelques problèmes:

  1. Vous semblez planifier à attendre la demande de terminer avant d'afficher une cellule. Cela a quelques points négatifs à ce. Il est gênant pour l'utilisateur et les plus susceptibles de geler l'interface utilisateur alors que la demande sort (ce qui peut prendre plusieurs secondes)
  2. Tout se passe dans la méthode de willDisplayCell.

Voici comment je pense que vous devriez résoudre ce problème:

  1. Vous affiche déclencheur cellulaire chargement de manière asynchrone .
  2. Afficher une cellule qui dit "Loading ..." avec votre spinner dessus (voir Tweetie 2 pour l'inspiration)
  3. Attendez que le rappel de votre demande
  4. Alimenter le modèle avec la réponse
  5. Supprimer la cellule "Chargement ..."
  6. Force un rechargement de votre [tableView reloadData] de données

Cela devrait vous permettre de réaliser ce que vous voulez faire.

Autres conseils

Vous pouvez essayer de le faire dans la cellForRowAtIndexPath: méthode du UITableView

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