2011-11-25 20 views
9

Tengo algunos problemas al pasar el contexto del delegado de la aplicación al controlador de la vista. He encontrado muchos tutoriales en Internet, y todos sugieren utilizar el método didFinishLaunchingWithOptions para crear el controlador de vista, establecer la propiedad del contexto y presionarlo. Mi problema es que quiero utilizar el guión gráfico, y el controlador de vista se crea y se inserta dentro de él, y no en el delegado de la aplicación.Pasar el contexto en iOS para usar Core Data con Storyboard

He intentado hacer esto en mi aplicación delegado:

- (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; 
} 

y esto en mi controlador de 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"; 
} 

Cuando elimino errores, puedo ver que en el delegado de la aplicación, el contexto se llena correctamente, y también la propiedad en el controlador de vista está bien. Pero cuando se invoca mi método saveContact, el contexto está vacío.

¿Tiene alguna sugerencia al respecto? ¿Cómo puedo pasar el contexto al controlador de visualización con guión gráfico?

Respuesta

9

Puede obtener RootViewController del guión gráfico en didFinishLaunchingWithOptions accediendo a

self.window.rootViewController 

en lugar de asignar una nueva.

Así que esas dos líneas en sus didFinishLaunchingWithOptions deberían tener este aspecto:

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

En lugar de pasar su contexto obeject logrado el controlador de vista tratar de conseguir que en el controlador de vista de la 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 mi me funcionó muy bien

+0

Esto hace que su jerarquía de clases muy rígido, el controlador de vista ahora debe saber sobre el delegado de la aplicación y depende de ella. Personalmente prefiero tener una propiedad en mi controlador de vista que asigno al crear la vista. –

+0

@Chris tienes razón. Este es solo otro método. Pensé usar esto en una de mis aplicaciones que tiene un contexto diferente. Esta es solo otra opción, entonces ... – Farini

Cuestiones relacionadas