2009-06-16 4 views
1

Cela semble être le cas. Techniquement, je peux faire ce travail, mais si je veux effectuer certaines animations de l'interface utilisateur, (en utilisant deleteRowsAtIndexPaths: withRowAnimation :) les choses deviennent poilues. Il semble que la source de données et l'interface utilisateur se disputent qui devrait supprimer en premier. Ensuite, je dois conserver artificiellement des données pour la mise à jour de l'interface utilisateur.Motif pour mettre à jour une UItableView et sa source de données après le filtrage avec NSPredicate

Ma configuration actuelle:

Dans mon modèle:

  1. Créer une NSArray multidimensionnelle pour tenir mes données. (chaque sous-tableau représente une section).
  2. Placez un NSDictionary dans chaque section pour représenter les données d'une cellule individuelle .

Dans mon contrôleur de vue:

  1. Créer une NSArray multidimensionnelle pour tenir mes contrôleurs cellulaires (mimant la structure de données).
  2. Affectez chaque dictionnaire de modèles à un ivar dans le contrôleur de cellule approprié .
  3. HOO les données à la cellule

Cela devient mon UITableView à l'écran avec des cellules correctement affichées. Maintenant, si je veux filtrer les données dans le tableau que je fais ce qui suit:

Dans mon modèle:

  1. Créer une instance de NSPredicate.
  2. Filtrez chaque sous-tableau du tableau multidimensionnel .
  3. Définissez un indicateur dans chaque dictionnaire indiquant que correspond aux résultats du tableau filtré .

À mon avis contrôleur:

  1. créer un nouveau Multidimensional NSArray. Ce tableau tiendra les contrôleurs de cellules de la « filtrée données »
  2. boucle à travers la actuelle du contrôleur RAID multidimensionnels. Ajouter au nouveau « tableau filtré si il est le drapeau de modèle est défini.
  3. Remplacez le contrôleur non filtré tableau avec le nouveau.
  4. Mise à jour de la table.

Cela fonctionne également très bien. Tant que cela ne me dérange pas l'interface utilisateur mise à jour instantanément.Si je veux supprimer des lignes avec animation, je dois passer ces index à la table à supprimer.

Pour ce faire, j'ajoute quelques étapes supplémentaires au contrôleur de vue:

À mon avis contrôleur:

  1. créer un nouveau Multidimensional NSArray. Ce tableau tiendra les contrôleurs de cellules de la « filtrée données »
  2. boucle à travers la actuelle du contrôleur RAID multidimensionnels. Ajouter au nouveau « tableau filtré si il est le drapeau de modèle est défini.
  3. Créer une nouvelle NSArray pour contenir les index à supprimer.
  4. en boucle le tableau contrôleur Multidimensional actuel. Ajouter l'index de sa cellule à . le « toBeDeleted » tableau si son drapeau de modèle est pas mis
  5. Remplacez le contrôleur non filtré tableau avec le nouveau
  6. effectuer deleteRowsAtIndexPaths:.. withRowAnimationn

Jusqu'à présent, cette méthode ne fonctionne pas le mieux. J'ai des problèmes en supprimant les lignes avec des cas de bordure (sections vides et toutes les cellules visibles étant supprimées). Cela m'a fait penser que ma méthodologie est peut-être défectueuse. Est-ce que quelqu'un a implémenté ceci dans une application? Comment avez-vous résolu cela? Vos animations de lignes fonctionnent-elles?

+0

J'ai implémenté ceci en utilisant le design que j'ai décrit [ici] (http://www.theflyingjalapenolives.com/2009/06/filtering-uitableviews-deleting-multiple-uitableviewcells-with-animation/) (blog personnel Je posterai un code spécifique quand je le nettoierai et le rendrai un peu plus générique. –

Répondre

0

Pour ne pas aggraver les choses, mais avez-vous essayé NSPredicate sur un périphérique réel?

J'ai trouvé que NSPredicate fonctionnait sur le simulateur, mais un peu comme NSXMLDocument, n'était pas disponible sur le périphérique lui-même (2.2.1).


mise à jour: Étant donné que NSPredicate est disponible, tout ce que je peux ajouter est que j'ai eu des résultats imprévisibles avec deleteRowsAtIndexPaths: withRowAnimation aussi bien - je devais régler pour appeler reloadData et ayant une transition non animée. Heureusement, comme j'ai un filtre très "soustractif" dans mon application, il y a généralement beaucoup de mouvement, donc il est évident pour l'utilisateur que quelque chose s'est passé. Dans votre cas où les changements visibles sont potentiellement non évidents, je soupçonne que du point de vue de la convivialité, il suffirait simplement d'utiliser un UIImageView animé allant du nord au sud à travers la zone UITableView. (un défi à part entière, malheureusement).

Cela aurait l'avantage supplémentaire de confirmer l'application du filtre à l'utilisateur même si aucun changement visible ne s'est produit.

+0

Ce n'est pas disponible sur 2.2.1, vous avez raison. Mais est disponible sur [expurgé]. –

+0

Intéressant - merci. –

Questions connexes