Die übergabe eines ManagedObjectContext auf den zweiten Blick
Schreibe ich mein erstes iPhone/Cocoa-app. Es hat zwei Tabellen-Ansichten innerhalb einer Ansicht navigation. Wenn man mit dem Finger eine Zeile in der ersten Tabelle anzeigen, gelangen Sie zu der zweiten Tabelle anzuzeigen. Ich möchte, dass die zweite Anzeige, um die Datensätze aus CoreData-stellen im Zusammenhang mit der Zeile, die Sie berührt in der ersten Ansicht.
Habe ich die CoreData Daten zeigt sich gut in der ersten Tabelle anzeigen. Sie können berühren Sie eine Zeile aus und gehen auf die zweite Tabelle anzeigen. Ich bin in der Lage, übergeben Sie Informationen aus dem ausgewählten Objekt von der ersten zu der zweiten Ansicht. Aber ich Schaffe es nicht, den zweiten Blick zu tun, seine eigenen CoreData Holen. Für das Leben von mir ich kann nicht den managedObjectContext-Objekt übergeben, um die zweite view-controller. Ich will nicht zu tun, die Suchvorgänge in der ersten Ansicht, und übergeben Sie ein Wörterbuch, denn ich möchte in der Lage sein zu verwenden, um ein Suchfeld zur Verfeinerung der Ergebnisse in der zweiten Ansicht, sowie das einfügen neuer Einträge in die CoreData Daten von dort.
Hier ist die Funktion, die übergänge von der ersten zur zweiten Ansicht.
- (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];
}
- Und dies ist die Funktion innerhalb SecondViewController, die Abstürzen:
- (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;
}
Irgendwelche Ideen auf, was mache ich hier falsch?
managedObjectContext ist eine beibehaltene Eigenschaft.
UPDATE: ich trug ein NSLog([[managedObjectContext registeredObjects] description]); in viewDidLoad und es erscheint managedObjectContext übergeben wird just fine. Immer noch Absturz, obwohl.
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: nicht finden konnte, ein NSManagedObjectModel für Entität name 'SecondEntity"
- Was passiert, wenn Sie den code initialisiert die gefundenen Ergebnisse-controller in viewDidLoad? Ich habe eine app, die im wesentlichen die gleiche Sache, und es funktioniert gut für mich, aber ich meine die gefundenen Ergebnisse-controller direkt in viewDidLoad mit initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:.
- Ich habe gerade versucht, stürzt es in der gleichen Weise. Die seltsame Sache ist, dass wenn ich einen breakpoint setzen, alle member-Variablen der selbst NULL sind, aber der Titel nicht richtig eingestellt, so dass kann nicht wahr sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie unterdrücken die '-managedObjectContext' nicht gefunden in den Protokollen Warnung durch Gießen Ihre Anwendung Delegierter erste:
Oh, das ist interessant. Ich verbrachte einige Qualität Zeit mit der stack-trace und ich denke ich habe es herausgefunden.
So pushViewController Anrufe viewDidLoad nicht einmal, sondern zweimal. Die erste Zeit es fordert, viewDidLoad, die Objekte erscheinen nicht korrekt gestartet werden. Das zweite mal, Sie sind. Also das erste mal, dieser code ausgeführt wird, kann nicht zugegriffen werden managedObjectContext und es löst eine Ausnahme aus. Das zweite mal, wenn es läuft, alles ist gut. Kein Absturz.
Gibt es eine Menge von Informationsquellen, um Probleme mit der viewDidLoad-Ausführung mehrmals auf Google, so denke ich, die Lösung ist nicht das fetch-Anfrage-Initialisierung in viewDidLoad.
Ich ve wurde kämpfen mit dem gleichen Problem und ich bin einfach noch ein Neuling. Ich denke, ich habe herausgefunden, was Los ist. Lassen Sie mich wissen, wenn das Sinn macht.
Kurz gesagt, Sie versuchen zu Holen eine Person aus einem objectContext, dass nicht noch einrichten. Ihre Optionen sind daher, um es einzurichten, dann rechts tun oder anderswo in der app, bevor Sie diese Ansicht geladen.
Wenn Ihre app ist setup wie die CoreDataBooks app demo aus dem iphone dev center mit einem Haupt-UIApplicationDelegate auch die Verwaltung des CoreData-stack, dann sollten Sie in der Lage sein, Folgendes zu tun:
if (managedObjectContext == nil) {
managedObjectContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
}
Dies sollte den trick tun.
in Ihrem ersten
tableViewController
haben , können Sie passieren diemanagedObjectContext
durch :secondTableController.managedObjectContext = [(AppDelegate *) [[UIApplication sharedApplication ] delegate ] managedObjectContext ]
vielleicht ist es ja auch okSind Sie sicher, dass es eine Entität namens "SecondEntity"? (Das wäre die einfache Möglichkeit der Interpretation der Fehlermeldung.)
Allerdings, wenn dies ist eine master-Liste -> detail-Ansicht Art der Interaktion, ich würde vorschlagen, die übergabe des ausgewählten Objekts direkt an den zweiten view-controller, statt ihm nur die "tname". Dieses Objekt vermutlich enthält alles, was Sie brauchen, um füllen Sie die zweite Tabelle direkt über dessen Eigenschaften.
So, Sie nicht wirklich tun, eine explizite abrufen in die zweite view-controller. I. e:
Nur zum Spaß.. versuchen zu ersetzen:
mit:
Sind Sie managedObjectContext durch einen setter, und dann versuchen, auf den ivar direkt. Je nachdem, wie Ihre Eigenschaften definiert sind, das kann nicht richtig sein. [self managedObjectContext] wird versuchen, den Zugriff auf den Wert über den getter statt direkt.
Ich hatte dieses problem und fand, dass mein Objekt die init-Nachricht war der Zugriff auf den managedObjectContext vor der setManagedObjectContext aufgerufen wurde...
Bevor:
Nach:
feh. Rookie Fehler.
Apple stellt ein Beispiel für ein Projekt namens "iPhoneCoreDataRecipes". Es ist ein sehr interessanter Artikel über die übergabe NSManagedObjectContext hier
Wenn Sie versuchen, zu implementieren, diese Art der Logik, dass jede managedObjectContext ist wie eine Insel auf seine eigene in jedem UIViewController
Versuchen Sie code Ändern
Mit diesem
Dies das problem sein könnte.
kurze Antwort: löschen Sie Ihre app dann wieder zu starten.
lange Antwort:
Wenn Sie erstellen und führen Sie Ihr Projekt, CoreData speichern Sie Ihr Modell, wohin, sagten Sie, Sie (persistent store Standort).
Wenn Sie etwas ändern in der CoreData-Modell, wenn Sie die app ausführen wieder das neue Modell nicht mit dem gespeicherten Modell geben Sie den Fehler zu finden.
Um es zu beheben, löschen Sie Ihre app. Dies wird loszuwerden des gespeicherten Modells, und wenn Sie es wieder laufen, es wird erstellen Sie Ihre neue Modell.
Eines ist sicher, die Zeile:
secondViewController.managedObjectContext = [self managedObjectContext];
Werden sollte:
secondViewController.managedObjectContext = self.managedObjectContext;
Es sei denn, das aktuelle Objekt implementiert eine Methode namens 'managedObjectContext' gibt die variable.