Escribo mi primera aplicación iPhone/Cocoa. Tiene dos vistas de tabla dentro de una vista de navegación. Cuando toca una fila en la primera vista de tabla, se le lleva a la segunda vista de tabla. Me gustaría que la segunda vista muestre registros de las entidades de CoreData relacionadas con la fila que tocó en la primera vista.Pasar un ManagedObjectContext a una segunda vista
Tengo los datos de CoreData apareciendo bien en la primera vista de tabla. Puede tocar una fila y acceder a la segunda vista de tabla. Puedo pasar información del objeto seleccionado de la primera a la segunda vista. Pero no puedo obtener la segunda vista para hacer su propia búsqueda de CoreData. Por mi vida, no puedo hacer que el objeto managedObjectContext pase al segundo controlador de vista. No quiero hacer las búsquedas en la primera vista y aprobar un diccionario porque quiero poder usar un campo de búsqueda para refinar los resultados en la segunda vista, así como insertar nuevas entradas a los datos de CoreData desde allí.
Aquí está la función que realiza la transición de la primera a la segunda vista.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here -- for example, create and push another view controller.
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil];
secondViewController.tName = [[selectedObject valueForKey:@"name"] description];
secondViewController.managedObjectContext = [self managedObjectContext];
[self.navigationController pushViewController:secondViewController animated:YES];
[secondViewController release];
}
Y esta es la función dentro SecondViewController que se estrella:
- (void)viewDidLoad {
[super viewDidLoad];
self.title = tName;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) { // <-- crashes here
// Handle the error...
}
}
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
/*
Set up the fetched results controller.
*/
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
// **** crashes on the next line because managedObjectContext == 0x0
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SecondEntity" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
// <snip> ... more code here from Apple template, never gets executed because of the crashing
return fetchedResultsController;
}
¿Alguna idea de lo que estoy haciendo mal aquí?
managedObjectContext es una propiedad retenida.
ACTUALIZACIÓN: inserté una descripción de NSLog ([[managedObjectContext registeredObjects]]); en viewDidLoad y parece que managedObjectContext se está pasando muy bien. Sin embargo, sigue estrellándose.
Terminación de aplicación debido a excepción no detectada 'NSInternalInconsistencyException', razón: '+ entityForName: no se pudo localizar un NSManagedObjectModel a nombre de la entidad 'SecondEntity''
¿Qué sucede cuando coloca el código que inicializa el controlador de resultados obtenidos en viewDidLoad? Tengo una aplicación que hace esencialmente lo mismo, y funciona bien para mí, pero creo mi controlador de resultados obtenidos directamente en viewDidLoad con initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName :. – Tim
@Tim Acabo de intentarlo, se bloquea de la misma manera. Lo extraño es que si establezco un punto de interrupción, todas las variables miembro de self son NULL, pero el título se establece correctamente, por lo que no puede ser cierto. – amo