2011-07-22 4 views
0

J'utilise Core Data pour une vue de table. Mes données sont classées par distance de votre position actuelle. Ce que j'aimerais, c'est avoir une nouvelle section pour les articles de 5, 10 et 20 miles.Section de distance NSFetchedResultsController sections

Ma valeur de distance est stockée dans le magasin de données en tant que NSInteger et je l'obtiens en utilisant un NSNumber dans mon modèle d'objet.

J'ai fait un peu de recherche autour et j'ai trouvé que j'ai besoin d'utiliser l'attribut sectionNameKeyPath pour rendre les données sectionnées.

Mon problème est que je ne connais pas la meilleure façon de regrouper les données. Au cours de mes recherches, je suis tombé sur une propriété transitoire ou en utilisant une catégorie de NSNumber pour déterminer la section dans laquelle l'élément devrait être.

L'une ou l'autre de ces méthodes est-elle le meilleur moyen d'obtenir mon résultat final? fournir des détails sur la façon de le mettre en œuvre?

Merci.

Répondre

1

Vous devez ajouter un attribut dérivé à l'objet (ce n'est pas strictement nécessaire dans le modèle), nommons-le range. Je voudrais en faire une propriété en lecture seule, vous pouvez mettre en cache la valeur ou non.

Quand il est 0-5, retour 5, 5.x - 10 retour 10, etc.

ensuite mis range comme sectionNameKeyPath.

+0

Merci pour votre réponse. Désolé si je suis un peu bête ici, mais quand vous dites un "attribut dérivé" voulez-vous dire dans mon objet de modèle de données. H fichier, je fais quelque chose comme: @property (monatomic, readonly) NSInteger * gamme; De plus, aurais-je besoin de créer ma propre méthode getter pour retourner 5, 10 ou 20? –

+0

Cette méthode fonctionnera mais c'est une solution rapide et sale qui embrouille l'interface utilisateur et le modèle ensemble. En règle générale, vous ne souhaitez pas contaminer votre couche de modèle avec les détails d'implémentation de la couche de vue. Que se passe-t-il si vous avez plusieurs vues de table avec des sections définies par des plages d'attributs différents? Allez-vous avoir plusieurs attributs dérivés, un pour chaque vue de table. Que se passe-t-il lorsque vous souhaitez utiliser le modèle de données dans une autre application? Il est préférable de garder le modèle et la vue aussi séparés que possible. – TechZen

+0

scrooby, oui. @TechZen, d'accord. Mais avez-vous une meilleure façon de gérer cela tout en utilisant le FetchedResultsController? J'aimerais savoir à ce sujet (pour exactement les raisons que vous dites). - - - L'option "clean design" consiste à implémenter toutes les méthodes déléguées, à jeter FetchedResultsController et à utiliser seulement FetchedResults - c'est beaucoup plus de travail pour obtenir le "design propre", scrooby que vous êtes en mesure de décider ce qui est désiré. Comme TechZen l'a dit, s'il y a beaucoup de possibilités, vous ne voudrez peut-être pas que cela pousse dans le modèle. – bshirley

0

Si vous voulez un comportement de section hautement personnalisé, vous devez sous-classer NSFetchedResultsController pour vous donner le comportement que vous voulez. Voir les documents de la classe NSFetchedResultsController pour plus de détails.

Vous devrez sous-classer dans ce cas parce que vous ne regardez pas un seul attribut ordonné comme la première lettre alphabétisée d'un attribut de chaîne mais plutôt une plage dans laquelle chaque attribut se situe.

Il s'agit d'une solution plus propre que de modifier le modèle de données car vous pouvez l'utiliser pour afficher les données de différentes manières dans de nombreuses vues de table différentes sans avoir à boucher votre modèle de données.

+0

Merci pour votre commentaire, connaissez-vous de bons exemples de sous-classe NSFetchedResultsController? Les docs d'Apple ont mentionné quelles méthodes vous pouviez sous-classer, mais je n'ai pas pu voir d'exemples. –

+0

Désolé, ce sont toujours tellement personnalisés que je ne pense pas que les gens font beaucoup d'exemples. Je ne suis pas sûr de savoir comment implémenter ce que vous voulez. Laisse moi y réfléchir. – TechZen

Questions connexes