2011-10-17 15 views
10

L'obiettivo è ottenere l'attuale NSManagedObjectContext per poter lavorare con Core Data. In iOS 4.3 ho impostato il delegato del UINavigationController di essere l'AppDelegate in questo modo (in AppDelegate.m):Ottieni NSManagedObjectContext quando si utilizza Storyboard

self.navigationController.delegate = self; 

e avrei potuto fare qualcosa di simile (ovunque mi serviva contesto):

NSManagedObjectContext *context = [self.navigationController.delegate performSelector:@selector(managedObjectContext)]; 

Ora, su iOS 5, sto usando uno storyboard e sto attraversando un momento difficile per capire come raggiungere questo obiettivo. Ho usato un delegato in primo luogo perché non penso che tu voglia passare il tuo AppDelegate.h in giro per tutto il tempo.

risposta

12

@Rose - Anche in questo caso? E 'altamente sconsigliato anche da Apple:

da Apple Doc:

Un controller della vista in genere non dovrebbe recuperare il contesto da un oggetto globale come l'applicazione delegato-questo rende l'architettura rigida applicazione. Né il controller di una vista deve creare un contesto per il proprio uso (a meno che non si tratti di un contesto nidificato). Ciò può significare che le operazioni eseguite utilizzando il contesto del controller non sono registrate in altri contesti, quindi i diversi controller di visualizzazione avranno prospettive diverse sui dati.

modo consigliato:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions 
{ 
// Override point for customization after application launch. 
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
MasterViewController *controller = (MasterViewController *)navigationController.topViewController; 
controller.managedObjectContext = self.managedObjectContext; 
return YES; 
} 
+0

Anche se questo argomento è vecchio, sei corretto e quindi l'ho contrassegnato come la risposta corretta. – mmvie

+2

Cosa succede se si desidera passare un controller di visualizzazione al contesto dell'oggetto gestito e non si avvicina affatto a applicationDidFinishLaunching? È stato creato solo 5 livelli in profondità da qualche altra parte nella mia app. – user798719

+0

@ user798719 Non è una cattiva pratica iniettarlo. Si prega di dare un'occhiata ai quadri DependencyInjection disponibili nella piattaforma iOS – badeleux

11

Non so se questo è quello che ti serve, ma può aiutare:
id appDelegate = (id)[[UIApplication sharedApplication] delegate]; self.managedObjectContext = [appDelegate managedObjectContext];

+0

Perfetto, grazie! – mmvie

+0

Amico, molte grazie !! – Farini

+0

Immagino di aver passato troppo tempo a cercare di capire come passare [managedObjectContext] dal delegato dell'app alla vista, ovviamente una soluzione migliore è solo quella di ottenere il moc dall'appdelegate. Eccezionale! – Farini

Problemi correlati