2009-05-14 6 views
0

Je crée un UITableView avec un contrôle UISegmented dans l'onglet Appels récents de l'application Téléphone.Configuration du modèle pour les données UITableView qui seront filtrées à l'aide d'un UISegmentedControl

Le premier segment sera tous les éléments, les 2 suivants seront des sous-ensembles de la liste complète des éléments.

J'ai créé 3 tableaux qui contiennent les 3 listes de données différentes.

Ma première solution est un échange de gros des données et un reload:

[self setData:newData]; 
[self.tableView reloadData]; 

Cela fonctionne très bien à l'exception de l'animation, il n'y a pas d'indicateurs que les données ont bien changé. Je pourrais ajouter une sorte de message indicateur, mais je préfère utiliser la méthode employée par l'application de téléphone, un effet "accordéon" effondrement des cellules supprimées et l'expansion des cellules ajoutées.

Pour ce faire, vous ne pouvez pas simplement échanger les données (ou le pouvez-vous?). Cela ne déclenche pas d'animation. Le seul moyen que je vois est de supprimer manuellement et d'ajouter des cellules du modèle de sauvegarde. Alors, quel est un algorithme efficace pour accomplir cela? Ma première estimation:

J'ai un tableau multidimensionnel pour représenter des sections de cellules.

  1. créer un tableau pour contenir l'index chemins de cellules à ajouter
  2. itérer dans chaque section des nouvelles données
  3. vérifier si la section des nouvelles données a le même nombre que l'ancien données
  4. sinon, itérer sur chaque élément les nouvelles données
  5. Si l'article est aussi dans les anciennes données, ne font rien
  6. Si l'article n'est pas dans les anciennes données, chemin d'index d'ajout d'élément à matrice de cellules à être ajouté
  7. pour chaque élément dans la section
  8. répétition pour chaque section Les nouvelles données
  9. créer un tableau pour maintenir l'index chemins de cellules à supprimer
  10. itérer dans chaque section des données VIEUX
  11. vérifier si la section des données NEW a le même compte que les anciennes données
  12. sinon, itérer sur chaque élément les anciennes données
  13. Si l'article est également dans les données NOUVEAU, rien
  14. Si l'article n'est pas dans les nouvelles données, ajouter le chemin d'index de l'élément à réseau de cellules soit supprimé
  15. répétition pour chaque élément de section
  16. répétition pour chaque section de données OLD

alors appeler les méthodes de UITableView apprpriate:

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

Cet algorithme semble avoir beaucoup de place pour l'amélioration. Quelqu'un at-il déjà abordé ce problème? Comment l'avez-vous mis en œuvre?

Merci pour toute entrée

Répondre

0

Il semble être beaucoup plus compliquée qu'elle doit être. UITableViews fonctionne sur une base "pull" - c'est-à-dire, au lieu de pousser les données sur une table, il appelle votre délégué de source de données et y récupère les données. Par conséquent, chaque fois que vous appelez le reloadData, vous pouvez échanger et renvoyer tout ce que vous voulez. Tout ce que vous avez à faire est d'utiliser les actions de contrôle segmentées pour changer une valeur d'index qui choisit quel tableau de données est le "courant" à utiliser quand la table demande la valeur d'une cellule.

Maintenant, en ce qui concerne l'animation de la modification, il existe plusieurs façons d'obtenir le même effet. Si vous voulez vraiment faire l'effet accordéon, vous devrez gérer beaucoup d'état pour le suivi si vous êtes en mode affichage ou changement de table, etc. Un moyen beaucoup plus simple serait d'avoir une vue de superposition que vous pourriez animer dans et dehors pour indiquer visuellement le changement. Ensuite, dans le gestionnaire d'achèvement de la vue d'animation, vous appelez le reloadData.

+0

méthode est logique, sauf que vous avez dit l'effet d'accordéon. Sinon, c'est facile. Je l'ai déjà implémenté sans animation, je voulais juste être joli ... J'ai considéré la superposition, mais j'essayais juste de faire en sorte que l'application utilise des comportements "standard". –