Sto scrivendo la mia prima app per iPhone/Cocoa. Ha due viste tabella all'interno di una vista di navigazione. Quando si tocca una riga nella prima vista tabella, si passa alla seconda vista tabella. Vorrei che la seconda vista visualizzasse i record delle entità CoreData relative alla riga che hai toccato nella prima vista.Passaggio di ManagedObjectContext a una seconda vista
Ho i dati di CoreData che mostrano bene nella prima vista tabella. Puoi toccare una riga e andare alla seconda vista tabella. Sono in grado di passare informazioni dall'oggetto selezionato dalla prima alla seconda vista. Ma non riesco a ottenere la seconda vista per fare il proprio recupero CoreData. Per la vita di me non riesco a far passare l'oggetto managedObjectContext al secondo controller di visualizzazione. Non voglio fare le ricerche nella prima vista e passare un dizionario perché voglio essere in grado di usare un campo di ricerca per affinare i risultati nella seconda vista, così come inserire nuove voci nei dati CoreData da lì.
Ecco la funzione che passa dalla prima alla seconda 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];
}
E questa è la funzione all'interno SecondViewController che si blocca:
- (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;
}
Tutte le idee su quello che sto facendo male qui?
managedObjectContext è una proprietà mantenuta.
UPDATE: Ho inserito un NSLog ([[objectObjectContext registeredObjects] description]); in viewDidLoad e sembra che managedObjectContext sia passato bene. Ancora in crash, però.
terminazione app a causa di eccezione non identificata 'NSInternalInconsistencyException', la ragione: '+ entityForName: impossibile individuare un NSManagedObjectModel per nome dell'entità 'SecondEntity''
Cosa succede quando si inserisce il codice che inizializza il controller dei risultati recuperati in viewDidLoad? Ho un'app che fa essenzialmente la stessa cosa, e funziona bene per me, ma creo il mio controller dei risultati recuperato direttamente in viewDidLoad con initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName :. – Tim
@Tim L'ho appena provato, si blocca nello stesso modo. La cosa strana è che se imposto un breakpoint, tutte le variabili membro di self sono NULL, ma il titolo viene impostato correttamente in modo che non possa essere vero. – amo