2013-05-14 2 views
0

J'ajoute une instance dans les données de base. L'entité est représentée par un NSArrayController. Je voudrais accéder à l'instance nouvellement ajoutée via le contrôleur.Données de base: comment mettre à jour un NSArrayController immédiatement après l'ajout d'un objet NSManagedObject?

Une « compétence » par exemple est ajouté, puis je tente d'y accéder par selectAddedObject comme suit:

-(void)addSkill 
{ 
    [self selectAddedObject:[NSEntityDescription insertNewObjectForEntityForName:@"Skill" 
                  inManagedObjectContext:self.managedObjectContext]]; 
} 

- (void)selectAddedObject:(NSManagedObject *)addedMO 
{ 
    [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]]; 
    NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]); 
} 

Cela semble ne fonctionner que si j'ajoute

[self.managedObjectContext processPendingChanges]; 

comme la première ligne de selectAddedObject:. Mais une fois que je fais cela, le document semble oublier qu'il doit encore enregistrer, et je pourrais quitter l'application sans que mon ajout soit automatiquement enregistré. Je ne veux pas forcer ça aux utilisateurs!

Des idées sur un moyen de mettre immédiatement à jour le contrôleur RAID d'une autre manière? Ou peut-être ajouter l'objet d'une autre manière? Quelques réponses antérieures (par exemple Updating NSTableView when enitiy is added to core data) semblent un peu obsolètes en raison des changements dans OSX.

Merci!

Répondre

1

Utilisez le contrôleur RAID pour ajouter l'objet. À un certain moment pendant la configuration, assurez-vous de l'entité est définie ([self.sectionArrayController setEntityName:@"Skill"]), puis faire tout votre travail pour créer et sélectionnez:

- (void)createAndSelectNewObject 
{ 
    Skill *addedMO = [self.sectionArrayController newObject]; 

    if([self.sectionArrayController commitEditing]) { 

     [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]]; 
     NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]); 
    } 
} 

Vous devriez engager toutes les modifications avant de changer la sélection aussi (et de modifier la sélection si les modifications ont été commises ou il n'y en avait pas).

+0

Merci, il semble très élégant de cette façon. J'ai un problème après avoir essayé cette solution: 'self.sectionArrayController' a toujours un nombre inchangé d'objets après la validation! Mais la valeur renvoyée est "OUI". Hmmm .... – markjs

+0

L'utilisation de 'add:' sur le contrôleur RAID (dans IB) ne sélectionne pas non plus le nouvel objet, pas même avec "Sélectionner les objets insérés" coché dans le constructeur de l'interface. – markjs

+0

Ce qui fonctionne, c'est d'ajouter '[self.managedObjectContext processPendingChanges];'. Je voudrais vraiment faire sans. Y a-t-il une raison pour que '-commitEditing' ne fonctionne pas, et que '-processPendingChanges' le fasse? – markjs

Questions connexes