138 votes

Comment détecter la fin du chargement d'un UITableView ?

Je veux modifier le décalage du tableau lorsque le chargement est terminé et ce décalage dépend du nombre de cellules chargées dans le tableau.

Y a-t-il un moyen sur le SDK de savoir quand le chargement d'une uitableview est terminé ? Je ne vois rien ni sur le délégué ni sur les protocoles de source de données.

Je ne peux pas utiliser le comptage des sources de données car le chargement ne concerne que les cellules visibles.

224voto

folex Points 1722

Améliorer la réponse de @RichX : lastRow peut être à la fois [tableView numberOfRowsInSection: 0] - 1 ou ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row . Le code sera donc :

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        //end of loading
        //for example [activityIndicator stopAnimating];
    }
}

UPDATE : Le commentaire de @htafoya est juste. Si vous voulez que ce code détecte la fin du chargement de toutes les données de la source, il ne le fera pas, mais ce n'est pas la question initiale. Ce code sert à détecter quand toutes les cellules qui doivent être visibles sont affichées. willDisplayCell: utilisé ici pour une interface utilisateur plus fluide (une seule cellule s'affiche généralement rapidement après l'affichage de l'écran). willDisplay: ). Vous pouvez également l'essayer avec tableView:didEndDisplayingCell: .

28voto

RichX Points 251

J'utilise toujours cette solution très simple :

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == lastRow){
        //end of loading
        //for example [activityIndicator stopAnimating];
    }
}

10voto

Kyle Clegg Points 8441

Voici une autre option qui semble fonctionner pour moi. Dans la méthode déléguée viewForFooter, vérifiez s'il s'agit de la dernière section et ajoutez votre code à cet endroit. Cette approche m'est venue à l'esprit après avoir réalisé que willDisplayCell ne tient pas compte des pieds de page si vous en avez.

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
{
  // Perform some final layout updates
  if (section == ([tableView numberOfSections] - 1)) {
    [self tableViewWillFinishLoading:tableView];
  }

  // Return nil, or whatever view you were going to return for the footer
  return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
  // Return 0, or the height for your footer view
  return 0.0;
}

- (void)tableViewWillFinishLoading:(UITableView *)tableView
{
  NSLog(@"finished loading");
}

Je trouve que cette approche fonctionne mieux si vous cherchez à trouver le chargement final pour l'ensemble de la UITableView et pas seulement les cellules visibles. En fonction de vos besoins, il se peut que vous ne souhaitiez que les cellules visibles. La réponse de folex est une bonne route.

6voto

René Retz Points 51

La meilleure approche que je connaisse est la réponse d'Eric à : Recevoir une notification lorsque UITableView a fini de demander des données ?

Mise à jour : Pour que cela fonctionne, je dois mettre ces appels dans -tableView:cellForRowAtIndexPath:

[tableView beginUpdates];
[tableView endUpdates];

0voto

umakanta Points 356

La réponse de @folex est juste.

Mais c'est échouer si le tableView a plus d'une section affichés à la fois.

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
   if([indexPath isEqual:((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject])]){
    //end of loading

 }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X