2009-10-12 5 views
0

Je travaille donc sur un clone de CoreDataBooks. C'est un peu différent. Lorsque le bouton '+' est appuyé, il lance un navController, contenant 2 vues. Le premier (AddPatientVC) demande le nom du patient puis il est poussé vers un second contrôleur de vue (AddPatientDetailVC) qui demande des informations plus détaillées. C'est le 2ème contrôleur de vue que j'ai configuré avec le délégué, pas le premier, comme dans CoreDataBooks. Pour une raison quelconque, lorsque la méthode déléguée est déclenchée, la méthode de notification ne se déclenche pas, j'ai donc perdu la trace de mon MOC, soit le MOC spécifique pour l'ajout d'un nouveau patient.Je pense avoir perdu mon contexte d'objet géré

L'erreur spécifique que je reçois est: « + entityForName: ne pouvait pas trouver un NSManagedObjectModel pour le nom de l'entité « patient » »

Voici mon code - addPatient, méthode déléguée et la méthode de notification. Toute suggestion sur la simplification serait appréciée. Thanx


-(void)addPatient:(id)sender 
{ 
    PatientAddViewController *patientAddViewController = [[PatientAddViewController alloc] initWithNibName:@"PatientAddViewController" bundle:nil]; 

    PatientAddDetailViewController *patientAddDetailViewController = [[PatientAddDetailViewController alloc] initWithNibName:@"PatientAddViewController" bundle:nil]; 
    patientAddDetailViewController.delegate = self; 

    //Create a new MOC for adding a book 
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init]; 
    self.addPatientManagedObjectContext = addingContext; 
    [addingContext release]; 


    [addPatientManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]]; 
    patientAddViewController.patient = (Patient *)[NSEntityDescription insertNewObjectForEntityForName:@"Patient" inManagedObjectContext:addingContext]; 



    //patientAddViewController.addPatientManagedObjectContext = self.addPatientManagedObjectContext; 
    UINavigationController *addingNavController = [[UINavigationController alloc] initWithRootViewController:patientAddViewController]; 
    [self.navigationController presentModalViewController:addingNavController animated:YES]; 

    [addingNavController release]; 
    [patientAddViewController release]; 

    } 


- (void)patientAddDetailViewController:(PatientAddDetailViewController *)controller didFinishWithSave:(BOOL)save 
{ 
    NSLog(@"Delegate Method fired"); 
    if (save) 
    {  
     NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; 

     //The notification isn't firing becuase addPatientManagedObjectContext is null for some reason 
     [dnc addObserver:self selector:@selector(addControllerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:addPatientManagedObjectContext]; 

     NSError *error; 
     //if (![patient.managedObjectContext save:&error]) 
     if (![addPatientManagedObjectContext save:&error]) 
     { 
      NSLog(@"Before Error"); 
      //Handle the error... 
      NSLog(@"Unresolved Error %@, %@",error, [error userInfo]); 
      exit(-1);//Fail 
      NSLog(@"After Error"); 
     } 


     [dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:addPatientManagedObjectContext]; 
    } 
    self.addPatientManagedObjectContext = nil; 
    [self.tableView reloadData]; 

    [self dismissModalViewControllerAnimated:YES]; 

} 

- (void)addControllerContextDidSave:(NSNotification*)saveNotification { 

    NSLog(@"Save Notification Fired"); 

    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext]; 

    // Merging changes causes the fetched results controller to update its results 
    [context mergeChangesFromContextDidSaveNotification:saveNotification]; 
} 
+0

Ok. J'ai travaillé en quelque sorte. La tableView n'a pas rechargé sauf si je suis retourné à mon écran principal et vice-versa, donc je pense que j'ai stocké accidentellement au MOC principal et pas le détaillé. hmmmm – monotreme

Répondre

0

Il semble que vous créez le contexte et le stocker dans self

NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init]; 
self.addPatientManagedObjectContext = addingContext; 
[addingContext release]; 

Mais vous appelez la méthode "ajouter" sur l'autre contrôleur:

patientAddViewController.patient = (Patient *)[NSEntityDescription 
    insertNewObjectForEntityForName:@"Patient" inManagedObjectContext:addingContext]; 

(rappelez-vous, vous avez publié 'addingContext' ci-dessus, 'addingContext' n'est pas garanti pour contenir quelque chose de valable à ce point nt)

On dirait que vous devriez passer self.addPatientManagedObjectContext plutôt que addingContext dans votre ligne insertNewObjectForEntityForName:@"Patient".

+0

Merci pour la suggestion. J'ai essayé cela. N'a pas fonctionné. Je pense que c'est principalement lié à la méthode de notification en bas. Il ne fonctionne tout simplement pas, je pense que j'ai confondu l'ajout de Context, addPatientManagedObjectContext et le ManagedObjectContext principal. – monotreme

Questions connexes