2010-08-02 10 views
0

Je peux juste passer des données entre les vues complètement faux ici, donc je suis ouvert à changer complètement la façon dont je passe mes données dans les deux sens.Comment faire pour passer NSManagedObjectContext à la vue racine dans UINavigationController?

Mon délégué application crée le NSManagedObjectContext et passe qui à mon menu principal à l'aide d'un UINavigationController qui rend la vue racine:

MainMenuViewController *mainMenuViewController = [[MainMenuViewController alloc] init]; 

NSManagedObjectContext *context = [self managedObjectContext]; 
if (!context) { 
    // Handle the error. 
} 
// Pass the managed object context to the view controller. 
mainMenuViewController.managedObjectContext = context; 

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:mainMenuViewController]; 
self.theNavController = aNavigationController; 

[[self theNavController] setNavigationBarHidden:YES animated:NO]; 

[window addSubview:theNavController.view]; 
[window makeKeyAndVisible]; 

[mainMenuViewController release]; 
[aNavigationController release]; 

Puis, quand ils choisissent un contrôleur de vue différent du menu principal, j'initialiser le nouveau contrôleur de vue, passer le NSManagedObjectContext à, puis poussez sur le UINavigationController:

BombsViewController *bombsViewController = [[BombsViewController alloc] init]; 
bombsViewController.managedObjectContext = self.managedObjectContext; 
[self.navigationController pushViewController:bombsViewController animated:YES]; 
[bombsViewController release]; 

Tout va bien jusqu'à ce que je décide de revenir au menu principal de mon BombsViewController. Je tente d'utiliser ce qui suit pour faire apparaître le contrôleur de vue racine en arrière sur le UINavigationController:

[self.navigationController popToRootViewControllerAnimated:YES]; 

Cependant, je ne vois pas un moyen de renvoyer le contrôleur de vue racine mon NSManagedObjectContext car la méthode popToRootViewControllerAnimated ne accepter une vue. J'ai essayé d'utiliser le popToViewController: animé: méthode mais les application se bloque avec un « Mettre fin à appelé après avoir jeté une instance de « NSException » », « Programme signal reçu: « SIGABRT ». »:

MainMenuViewController *mainMenuViewController = [[MainMenuViewController alloc] init]; 
mainMenuViewController.managedObjectContext = self.managedObjectContext; 
[self.navigationController popToViewController:mainMenuViewController animated:YES]; 
[mainMenuViewController release]; 

Répondre

1

Pourquoi le renvoyer? Votre contrôleur de vue racine n'a pas été -dealloc 'ed donc il existe toujours en mémoire et a toujours une référence à NSManagedObjectContext. Il n'y a rien à repasser.

L'erreur que vous obtenez n'est pas liée aux données de base. Exécutez-le dans le débogueur et définissez un point d'arrêt sur objc_exception_throw et voyez où il se bloque.

+0

J'avais l'impression que les contrôleurs de vue étaient automatiquement désalloués lorsqu'ils n'étaient plus le focus actuel de UINavigationController. Devinez qui change tout. – Rob

+0

Ils ne sont libérés que lorsqu'ils sont retirés de la pile. Lorsque vous poussez une autre vue sur le dessus, elle ne libère pas la vue en dessous. Lorsque vous sortez un contrôleur de vue de la pile, il est libéré. –