2010-09-16 3 views
1

Normalement, pour utiliser UITableView, le nombre de sections et de rangées par section est connu. Mais que se passe-t-il s'ils ne le sont pas? Je veux implémenter une recherche paresseuse, de sorte que je recherche réellement la prochaine correspondance quand de nouvelles données doivent être montrées. Quelque chose sur les lignes de: db.prepareSearch(query), puis appelez quelque chose comme db.nextSearchResult() quand il est temps d'afficher une nouvelle cellule. Le résultat de la recherche détermine si une nouvelle section est requise ou non (les résultats de recherche sont triés de manière inhérente). Je ne sais pas pourquoi cela n'a pas été fait de cette façon, de sorte qu'il demande une section jusqu'à ce qu'il n'y en ait plus ni disponible ni nécessaire, et pour les cellules de la section jusqu'à ce qu'il n'y en ait plus ni disponible ni nécessaire, au lieu d'avoir pour spécifier les totaux, ce qui implique d'avoir à terminer toute la recherche avant de commencer à afficher les premiers résultats.Comment utiliser UITableView lorsque le nombre total de sections et de rangées est inconnu (et potentiellement important)

Répondre

2

Pour obtenir le nombre de sections et de rangées, c'est facile - demandez à votre source de données. Si votre source de données n'a aucun moyen de vous le dire, faites un chemin. Par exemple, si vous devez interroger une table et demander combien de lignes correspondent à vos sections, faites-le. Ensuite, pour chaque section, demandez combien de lignes correspondent à cette section.

Il semble également que vous souhaitiez paginer vos données. Signification lorsque vous arrivez à un certain point, avoir une cellule "charger plus de données" ou un peu comme ça. C'est bien aussi, il suffit d'ajouter un nœud sentinelle à votre source de données, et chaque fois que cet élément particulier s'affiche, affichez votre cellule alternative pendant que vous chargez vos données, puis supprimez-le après que vos prochaines données soient récupérées. Je fais cela dans quelques unes de mes applications.

+0

Lorsque vous dites 'charger plus de données', je suppose que vous ajoutez à la source de données, puis [table reloadData] non? Ne va-t-il pas pépiller visuellement en faisant ça? – apalopohapa

+0

Il ne devrait pas tomber en panne quand vous faites cela. Mais oui, chaque fois que vous ajoutez à la source de données, ou en supprimez, modifiez l'ordre de ses éléments, etc., vous devrez recharger vos données. Une optimisation courante consiste simplement à recharger ce qui est visible (cellules à l'écran plus typiquement 2 cellules de chaque côté de la cellule supérieure et inférieure), puisque les autres cellules au-delà de ces limites seront rechargées lorsqu'elles redeviendront visibles. – jer

+0

Donc, disons que vous pouvez voir 10 cellules, et que vous regardez actuellement # 1 par # 10, et que vous avez indiqué à UITableView que vous avez 1 section et 12 lignes. Ensuite, l'utilisateur défile vers le bas, donc cellForRowAtIndexPath sera appelé pour la ligne 11 et peut-être 12. Ensuite, je récupère plus de données, reloadData, et dit à UITableView que j'ai 14 lignes. Est-ce qu'il demanderait seulement les rangs # 2 à # 12 et ne pas faire de pépin? – apalopohapa

0

Si je comprends bien, au moment de dessiner/peupler, vous saurez combien de lignes/sections vous avez. Si vous modifiez les données sous-jacentes en utilisant db.nextSearchResult(), vous devez appeler le [tableView reloadData] pour déclencher une mise à jour de l'interface utilisateur. À ce stade, vous devez connaître le nombre de sections et de lignes que vous possédez.

Je dois admettre que je suis un peu confus à la question exacte ici.

+0

C'est la chose, je ne sais pas combien de lignes/sections y a-t-il au total quand je commence à peupler. Par exemple, supposons que vous ayez une liste triée par ordre alphabétique de contacts (en milliers de). Et vous voulez afficher ceux qui ont le mot «blvd» dans leur adresse. Vous sectionnez par première lettre du nom de famille. Donc, vous commencez avec la première personne (M. Asdf) et la recherche.Dites que c'est un match, alors vous avez votre premier résultat, et vous continuez à collecter les 8 matchs qui correspondent à votre écran. – apalopohapa

+0

Avec la recherche paresseuse, vous allez chercher les contacts suivants jusqu'à ce que vous trouviez une correspondance, chaque fois que l'utilisateur défile vers le bas. Et vous commencerez à remplir de plus en plus la source de données avec les résultats de la recherche, au lieu de parcourir les milliers de contacts pour que vous puissiez dire à UITableView combien de lignes/sections il y a. – apalopohapa

Questions connexes