2010-04-29 4 views
0

J'ai un ensemble de 100 lignes, assez similaires aux valeurs qui peuvent être sélectionnées dans un sélecteur. Lorsque l'utilisateur fait défiler la table, je souhaite que les lignes soient ajoutées comme une ceinture d'assemblage permanente. Ainsi, lorsque l'utilisateur fait défiler vers le bas et atteint la ligne 100, et défile encore plus loin, la vue de table montrera à nouveau la ligne 1, et ainsi de suite. Inverser la direction même chose.Comment faire une vue de table qui peut défiler pour toujours?

Mes pensées:

  • ne pas afficher les indicateurs de défilement (ils feraient sens pas beaucoup, probablement)
  • la valeur à retourner dans la méthode déléguée numberOfRows? Cette constante d'infini?
  • dans cellForRowAtIndexPath: envelopper simplement l'index quand il dépasse les limites?

Répondre

2

Je n'ai pas essayé cela mais voici une idée. Disons N = 100, puisque vous avez 100 lignes. Ce que nous ferons, c'est de dire à la table que nous avons 200 lignes, mais nous laisserons l'utilisateur défiler dans la plage 50-150. Dites (la tableview) que vous avez doublé ce nombre de lignes, donc pour numberOfRows, renvoyez 2 * N. Dans cellForRowAtIndexPath, renvoyez toujours la cellule correspondant à (ligne% N).

Maintenant, init a fait défiler la table jusqu'à la ligne N (au lieu de 0) afin que l'utilisateur puisse faire défiler dans l'une ou l'autre direction. Lorsque l'utilisateur fait défiler vers le haut, la vue de table demandera finalement la ligne N + (N/2), quand cela arrive, envoyez un scrollToRowAtIndexPath: atScrollPositionanimated: pour faire défiler jusqu'à la ligne-N. Cela repositionnera la table par N (c'est-à-dire: de 150 à 50), même cellule mais nous ne pourrons jamais quitter la table de cette façon. Faites de même lorsque la vue de table demande une cellule à la ligne N- (N/2) pour le défilement vers le haut.

Vous aurez à faire face au cas particulier où les cellules N correspond à la vue avec une pièce supplémentaire, à savoir: et si N étaient 1?

3

De nombreuses applications le font. L'idée est que le début de la table est toujours le même, mais vous continuez à ajouter à la fin, donc la table ne cesse de croître.

Disons que vous avez d'abord 100 éléments de données. Votre numberOfRows renvoie alors 101. Les 100 premières cellules sont normales. Et les indicateurs de défilement ont encore du sens. Si la 101e cellule est affichée, vous affichez un indicateur de progression, tel que UIActivityIndicator, dans la cellule et lancez le processus pour charger les 100 lignes suivantes. Lorsque les données arrivent, vous rechargez la table entière avec UITableView reloadData ou vous insérez des nouvelles cellules individuellement avec UITableView insertRowsAtIndexPaths:withRowAnimation:. Donc, vous gardez infiniment d'ajouter à la table. C'est plus facile que d'essayer de garder la table comme une "fenêtre" qui est toujours à N cellules/lignes et de décharger depuis le début de la table. Si vous avez besoin de ce type de fenêtre, vous pouvez reconsidérer si c'est vraiment la meilleure façon d'interagir avec vos données.

3

Je viens de terminer la mise en œuvre d'une variante de cela. Supposons que vous ayez 100 lignes et que 8 d'entre elles tiennent dans un écran.

Commencez par ajouter les 8 dernières lignes d'abord, puis les 100 lignes normalement, puis les 8 premières lignes à la fin. Recentrer la tableview en utilisant setContentOffset à la première ligne de la 100.Lorsque l'utilisateur défile en dessous de la 100ème, il voit les lignes 1-8, vous pouvez le détecter dans la fonction de délégué viewDidScroll et recentrer le retour au premier enregistrement (assurez-vous que le drapeau animé est NON quand vous faites ce). De même, lorsque l'utilisateur passe devant 1, il verra les 8 derniers enregistrements, vous pouvez recentrer la vue de défilement pour afficher les 8 derniers enregistrements de la section 100 lignes.

Cela implémente réellement le défilement circulaire et l'utilisateur peut continuer à défiler dans les deux sens.

Questions connexes