0

J'ai besoin de conseils sur ce problème. J'ai un contrôleur de navigation, avec le contrôleur de racine utilisant CoreData et un NSFetchController. Maintenant, le contrôleur racine fonctionne correctement. Lorsque je clique sur un élément, il doit afficher hiérarchiquement le prochain UITable associant les valeurs de la ligne dans le contrôleur racine précédent. Maintenant, je ne suis pas sûr de ce que je devrais passer en tant que propriété au prochain UITableViewController. Devrait-il être un tableau, ou devrais-je passer le NSFetchedResultsController? Il y aura un autre niveau dans la hiérarchie après le second, comme un point de note.Objectif-C: Passage hiérarchique de CoreData dans NavigationController

Merci Doron

Répondre

3

Vous avez un couple d'options, au moins:

  1. passer une référence au contrôleur d'objet géré par le contrôleur de vue parent au contrôleur de vue de l'enfant; ou,
  2. rendre la propriété MOC disponible auprès du délégué de l'application, qui est disponible à tout contrôleur de vue

Certains préfèrent la seconde option que vous pouvez réutiliser et réorganiser les contrôleurs de vue dans différentes hiérarchies. En déconnectant le MOC des contrôleurs parent et enfant, vous gagnez un peu plus de flexibilité de conception. En outre, si votre application doit gérer simultanément plus d'un magasin persistant, l'accès à partir d'un point central pour créer plusieurs MOC réduit la complexité du code. Une fois que vous avez le MOC dans son contrôleur de vue, vous pouvez créer votre contrôleur de résultats récupérés dans ce contrôleur de vue et appliquer des opérations dans leurs propres threads.

EDIT

Il semble que vous avez un à plusieurs entre Site et Post (à savoir une entité du site a de nombreuses entités postales). Votre contrôleur de vue de liste "Posts" peut inclure un objet géré site, un ID d'objet géré siteID ou une propriété de chaîne siteName.

Lorsque vous appuyez sur la liste VC "Posts", définissez sa propriété site ou siteName et configurez le prédicat de requête en conséquence.

Par exemple, le prédicat de votre demande de récupération devrait inclure quelque chose comme site.name LIKE '%@' en elle, par exemple:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(site.name like '%@')", self.site.name]]; 
[fetchRequest setPredicate:requestPredicate]; 
// ... 

Ou vous pouvez comparer sur managed object IDs, ce qui est généralement mieux pour les comparaisons uniques:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(site = %@)", self.siteID]]; 
[fetchRequest setPredicate:requestPredicate]; 
// ... 

Dans les deux cas, vous avez filtré votre magasin de données principales pour qu'il corresponde à toutes les entités Post ayant un nom site ou un ID d'objet géré site équivalent à vos critères. Une fois que vous effectuez l'extraction, ces entités résident généralement dans un NSSet* ou NSArray* que vous pouvez facilement utiliser comme magasin de données UITableView, en particulier si vous utilisez un contrôleur de résultats récupérés.

+0

Merci Alex, j'ai un peu essayé de le faire, car j'utilise un AppController où je passe entre autres les contrôleurs du MOC. En faisant cette approche (création d'une nouvelle requête), je ne suis pas sûr de savoir comment lier l'entité en fonction du résultat de la précédente (c'est-à-dire Site -> Posts, comment faire un prédicat pour se rapporter au site sélectionné). C'est ce que je voulais savoir. Merci compagnon – Doz

+0

Encore une chose, Juste une note, mon modèle a la propriété Site qui a un NSSET de nombreux messages (c'est pourquoi j'ai eu l'idée d'un NSArray à passer) mais ouais je ne sais pas de quelle façon je devrais procéder. Vous recommandez d'utiliser MOC, mais si je peux obtenir des éclaircissements sur la façon dont il est utilisé, mapper en fonction du site sélectionné. – Doz

+0

Je joue actuellement avec le MOC, en utilisant NSPredicate * pred = [NSPredicate predicateWithFormat: @ "(site =% d)", i]; Où i est l'objet d'entité de site que je veux comparer. De toute évidence% d n'est pas la syntaxe correcte, alors comment puis-je résoudre ce problème si je devais aller avec MOC? – Doz