2010-02-17 3 views
3

J'essaie de mettre en œuvre quelque chose de similaire au navigateur iTunes, pour naviguer dans une simple base de données de livres. J'ai les entités suivantes - Auteur, Genre et Livre. Je voudrais afficher une liste d'auteurs et une liste de genres, qui agissent pour filtrer la liste principale de livre.
J'ai essayé de faire cela de 2 façons différentes - comme le modèle:Hiérarchie de données Cocoa et navigateur

Author (has many) Genres (has many) Books 

... avec plusieurs instances du même genre afin que chaque auteur a sa propre pour un nom de genre donné, je une belle hiérarchie de drill-down à afficher dans mes vues de table (bien que ce soit un peu illogique de dupliquer des Genres). Cependant, lorsque je sélectionne plusieurs Auteurs, je finis par afficher des dupes du même Genre, car ce sont en fait des objets distincts.

Alors, j'ai essayé de le faire, plus sensible, avec ces relations:

Author (has many) Books 
Book (has one) Genre 

je peux obtenir le tableau genre en prenant du syndicat distinct de genre dans l'auteur actuellement sélectionné (s) book array, mais maintenant je me retrouve avec le problème de filtrer la liste de livres affichée en fonction du (des) genre (s) sélectionné (s). Parce que les genres sont partagés, je ne peux pas utiliser CurrentGenre.books, ou je perds le filtrage auteur sélectionné. J'ai remarqué le champ 'filter predicate' dans le constructeur de l'interface, disponible sur les contrôleurs d'objets, mais je suis en train de travailler sur comment l'utiliser pour appliquer le genre sélectionné comme filtre à une liste d'épisodes. The apple documentation dit:

« Vous pouvez taper un prédicat directement dans le champ de texte de l'éditeur de prédicats dans le panneau de l'inspecteur de l'interface Builder ou vous pouvez le configurer par programmation setFetchPredicate :.

ce qui me donne l'impression que je suis sur la bonne voie, mais c'est à peu près la fin du jeu. J'essaye de verrouiller le modèle dans un joli style Cocoa-esque maintenant, afin de minimiser les bits de 'code de colle' et les changements plus tard, il semble que ce soit un problème assez simple Je serais capable de trier graphiquement dans IB, mais jusqu'ici ça m'a échappé!

Merci d'avance.

Répondre

2

Je suis un peu confus par votre introduction "épisodes" au milieu de la discussion, mais je suppose que vous voulez simplement dire "livres" encore.

Vous êtes définitivement sur la bonne voie.Vous voulez un modèle de données comme ceci:

Auteur < - >> Livre
Genre < - >> Livre

Ou peut-être même:
Auteur < < - >> Livre (si vous soutenez ouvrages de référence, etc.)
Genre < < - >> livre (si vous voulez un support multi-genre)

une fois qu'un utilisateur a sélectionné auteur (s) et le genre (s) vous voulez un contrôleur RAID livre utiliser un filtre predica te qui ne montre que des livres avec ces auteurs ou genre (s).

MISE À JOUR
Cela devrait fonctionner:

  1. Bind le prédicat de filtre de contrôleur RAID livre à une nouvelle propriété sous-jacente « bookFilterPredicate » dans votre délégué de l'application.
  2. Ajoutez des prises pour les contrôleurs de tableaux Auteur et Genre.
  3. Observez les modifications apportées aux propriétés selectedObjects des deux contrôleurs RAID.
  4. Lorsque soit des modifications, mettez à jour la propriété prédicat de filtre comme ceci: self.bookFilterPredicate = [NSPredicate predicateWithFormat:@"author IN %@ && genre IN %@",authorArrayController.selectedObjects,genreArrayController.selectedObjects];
+0

Whoops, je en train de jouer avec différents exemples pour expliquer le problème le plus simplement possible, et a fini par être incompatibles. J'aurais dû être plus clair - Je comprends que je vais devoir appliquer un prédicat pour filtrer le contrôleur de tableau, mais je ne sais pas comment mettre en place cette relation dans IB, si c'est possible, ou si je veux dois-je revenir à écrire de la colle pour l'attacher ensemble? – Scott

+0

Je * pense * que vous devez utiliser du code car je ne vois aucun moyen d'extraire des informations de n'importe quel (et vous tirerez de deux) contrôleurs de tableau dans la boîte de prédicat de filtre. – gerry3

+0

Je m'en doutais autant, mais la référence dans le doco de la pomme me jeta au large! Cela a l'air super, applaudissements. – Scott

Questions connexes