2011-11-25 10 views
9

Sto riscontrando alcuni problemi nel passaggio del contesto dal delegato dell'app al controller della vista. Ho trovato molti tutorial su internet e tutti suggeriscono di usare il metodo didFinishLaunchingWithOptions per creare il controller di visualizzazione, impostare la proprietà context e premerla. Il mio problema è che voglio usare lo storyboard, e il controller di visualizzazione è stato creato e inserito all'interno di esso, e non nel delegato dell'app.Passare il contesto in iOS per utilizzare i dati principali con Storyboard

Ho provato a fare questo nella mia app delegato:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
//instantiate local context 
NSManagedObjectContext *context = [self managedObjectContext]; 
if (!context) 
{ 
    // Handle the error. 
    NSLog(@"Error: Context is null"); 
} 

//reference the view controller 
helloCoreDataViewController1_001 *rootViewController = [helloCoreDataViewController1_001 alloc]; 

// Pass the managed object context to the view controller 
rootViewController.managedObjectContext = context; 

return YES; 
} 

e questo a mio controller della vista:

@implementation helloCoreDataViewController1_001 

@synthesize name, address, phone, status, managedObjectContext; 
//.... 

- (IBAction)saveContact 
{ 
NSLog(@"name: %@",self.name.text); 
NSLog(@"address: %@",self.address.text); 
NSLog(@"phone: %@",self.phone.text); 

//Save the new instance of the contact entity 
Contact *contact = (Contact *)[NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:managedObjectContext]; 

[contact setContactName:[NSString stringWithFormat:@"%@",self.name.text]]; 
[contact setValue:self.address.text forKey:@"address"]; 
[contact setContactPhone:[NSString stringWithFormat:@"%@",self.phone.text]]; 

NSError *error = nil; 

if (![managedObjectContext save:&error]) 
{ 
    // Handle the error. 
    NSLog(@"error: %@", error.description); 
    self.status.text = @"Error: contact NOT saved"; 
} 
else 
    self.status.text = @"Contact saved"; 
} 

Quando il debug, vedo che nel delegato app, il contesto è popolato correttamente e anche la proprietà nel controller della vista è ok. Ma quando viene invocato il metodo saveContact, il contesto è vuoto.

Avete suggerimenti a riguardo? Come posso passare il contesto al controller di visualizzazione con storyboard?

risposta

9

È possibile ottenere RootViewController del Storyboard in didFinishLaunchingWithOptions accedendo a

self.window.rootViewController 

invece di assegnarne uno nuovo.

Così quelle due righe nei vostri didFinishLaunchingWithOptions dovrebbe assomigliare a questa:

helloCoreDataViewController1_001 *rootViewController = (helloCoreDataViewController1_001 *)self.window.rootViewController; 
rootViewController.managedObjectContext = context; 
-1

Invece di passare il vostro contesto obeject gestito al controller della vista cercare di farlo sul controller vista dalla AppDelegate:

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 
if (managedObjectContext == nil) { 
    id appDelegate = (id)[[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [appDelegate managedObjectContext]; 
    }... //finish your fetch request of course... 
} 

Con me ha funzionato splendidamente

+0

questo rende il vostro gerarchia di classe molto rigida, il controller di vista ora deve conoscere il delegato app e dipende da esso. Personalmente preferisco avere una proprietà sul mio controller di visualizzazione che assegno quando creo la vista. –

+0

@Chris hai ragione. Questo è solo un altro metodo. Ho pensato di usarlo in una delle mie app che ha un contesto diverso. Questa è solo un'altra opzione allora ... – Farini

Problemi correlati