Übergeben eines ManagedObjectContext an eine zweite Sicht

8

Ich schreibe meine erste iPhone / Cocoa App. Es verfügt über zwei Tabellenansichten innerhalb einer Navigationsansicht. Wenn Sie in der ersten Tabellenansicht eine Zeile berühren, gelangen Sie in die zweite Tabellenansicht. Ich möchte, dass die zweite Ansicht Datensätze von den CoreData-Entitäten anzeigt, die sich auf die Zeile beziehen, die Sie in der ersten Ansicht berührt haben.

Ich habe die CoreData-Daten in der ersten Tabellenansicht angezeigt. Sie können eine Zeile berühren und zur zweiten Tabellenansicht wechseln. Ich kann Informationen vom ausgewählten Objekt von der ersten zur zweiten Ansicht weiterleiten. Aber ich kann die zweite Ansicht nicht dazu bringen, einen eigenen CoreData-Abruf durchzuführen. Für das Leben von mir kann ich nicht das ManagedObjectContext-Objekt an den zweiten View-Controller übergeben. Ich möchte die Suche nicht in der ersten Ansicht durchführen und ein Wörterbuch weitergeben, weil ich in der Lage sein möchte, ein Suchfeld zu verwenden, um Ergebnisse in der zweiten Ansicht zu verfeinern, und neue Einträge von dort in die CoreData-Daten einzufügen / p>

Hier ist die Funktion, die von der ersten zur zweiten Ansicht übergeht.

%Vor%

Und das ist die Funktion in SecondViewController, die abstürzt:

%Vor%

Irgendwelche Ideen, was ich hier falsch mache?

managedObjectContext ist eine beibehaltene Eigenschaft.

UPDATE: Ich habe eine NSLog ([[managedObjectContext registredObjects] Beschreibung) eingefügt]); in viewDidLoad und es scheint, dass managedObjectContext gerade gut übergeben wird. Trotzdem stürzt es ab.

Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: '+ entityForName: konnte kein NSManagedObjectModel für den Entitätsnamen' SecondEntity ''

finden     
amo 02.07.2009, 14:02
quelle

10 Antworten

7

Oh, das ist interessant. Ich verbrachte einige Zeit mit der Stapelverfolgung und ich denke, ich habe es herausgefunden.

pushViewController ruft also viewDidLoad nicht einmal, sondern zweimal auf. Beim ersten Aufruf von viewDidLoad werden die Objekte anscheinend nicht ordnungsgemäß instanziiert. Das zweite Mal sind sie. Wenn also dieser Code zum ersten Mal ausgeführt wird, kann er nicht auf managedObjectContext zugreifen und löst eine Ausnahme aus. Beim zweiten Mal läuft alles gut. Kein Absturz.

Es gibt viele Hinweise auf Probleme mit viewDidLoad, die mehrmals auf Google ausgeführt werden. Daher denke ich, dass die Lösung diese Abrufanforderung nicht in viewDidLoad ausführen soll.

    
amo 03.07.2009, 06:00
quelle
18

Sie können die Warnung '-managedObjectContext', die nicht in den Protokollen gefunden wird, unterdrücken, indem Sie zuerst Ihren Anwendungsdelegaten anstoßen:

%Vor%     
Sascha Konietzke 16.10.2009 09:36
quelle
1

Ich habe mit dem gleichen Problem gekämpft und bin immer noch nur ein Neuling. Ich denke, ich habe herausgefunden, was vor sich geht. Lass es mich wissen, wenn das Sinn macht.

Kurz gesagt versuchen Sie, eine Entität von einem objectContext abzurufen, der noch nicht eingerichtet wurde. Ihre Optionen sind also, es dann einzurichten oder woanders in der App zu machen, bevor diese Ansicht geladen wird.

Wenn Ihre App wie die CoreDataBooks-App aus dem iphone-Entwicklungscenter mit einem Haupt-UIApplicationDelegate eingerichtet wird, der auch den CoreData-Stack verwaltet, sollten Sie Folgendes tun können:

if (managedObjectContext == nil) { managedObjectContext = [[[UIApplication sharedApplication] delegate] managedObjectContext]; }

Dies sollte den Trick machen.

    
aryeh 14.09.2009 21:03
quelle
1

in Ihrer ersten tableViewController , können Sie die managedObjectContext von: secondTableController.managedObjectContext = [(AppDelegate *) [[UIApplication sharedApplication ] delegate ] managedObjectContext ] übergeben, vielleicht ist es in Ordnung

    
Weizhi 11.07.2012 03:47
quelle
0

Sind Sie sicher, dass es eine Entität namens "SecondEntity" gibt? (Das wäre der direkte Weg, die Fehlermeldung zu interpretieren.)

Wenn dies jedoch eine Hauptliste ist - & gt; Ich würde empfehlen, das ausgewählte Objekt direkt an den zweiten View-Controller zu übergeben, anstatt es nur mit dem "tname" zu versehen. Dieses Objekt enthält vermutlich alles, was Sie benötigen, um die zweite Tabelle direkt über ihre Eigenschaften zu füllen.

Auf diese Weise führen Sie eigentlich keinen expliziten Abruf im zweiten Ansichtscontroller durch. Ie:

%Vor%     
Daniel Dickison 02.07.2009 15:20
quelle
0

Nur für Tritte .. versuche es zu ersetzen:

%Vor%

mit:

%Vor%

Sie setzen managedObjectContext über einen Setter und versuchen dann direkt auf den ivar zuzugreifen. Abhängig davon, wie Ihre Eigenschaften definiert sind, ist dies möglicherweise nicht korrekt. [self managedObjectContext] wird versuchen, auf den Wert über den Getter zuzugreifen, anstatt direkt.

    
mmc 02.07.2009 15:37
quelle
0

Ich hatte dieses Problem und stellte fest, dass die Initialisierungsnachricht meines Objekts auf den managedObjectContext zugreift, bevor der setManagedObjectContext aufgerufen wurde ...

Vorher:

%Vor%

Nachher: ​​

%Vor%

feh. Anfängerfehler.

    
Chad Celsius 20.04.2010 05:01
quelle
0

Apple stellt ein Beispielprojekt namens "iPhoneCoreDataRecipes" zur Verfügung. Es gibt einen sehr interessanten Artikel über die Weitergabe von NSManagedObjectContext hier Wenn Sie versuchen, diese Art von Logik so zu implementieren, dass jeder managedObjectContext in jedem UIViewController

als eigenständiges Island fungiert

Versuchen Sie, den Code zu ändern

%Vor%

Mit diesem

%Vor%     
teliaz 04.07.2011 22:07
quelle
-1

Dies könnte das Problem sein.

kurze Antwort: Löschen Sie Ihre App und führen Sie sie erneut aus.

lange Antwort:

Wenn Sie Ihr Projekt erstellen und ausführen, speichert CoreData Ihr Modell an jedem Ort, an den Sie es gesagt haben (persistenter Speicherort).

Wenn Sie etwas im CoreData-Modell ändern, wenn Sie die App erneut ausführen, stimmt das neue Modell nicht mit dem gespeicherten Modell überein, das diesen Fehler verursacht.

Um es zu beheben, löschen Sie Ihre App. Dadurch wird das gespeicherte Modell gelöscht und wenn Sie es erneut ausführen, erstellt es Ihr neues Modell neu.

    
jasongregori 05.10.2009 19:40
quelle
-2

Eins ist sicher, die Linie:   secondViewController.managedObjectContext = [self managedObjectContext];

Sollte sein:   secondViewController.managedObjectContext = self.managedObjectContext;

Es sei denn, das aktuelle Objekt implementiert eine Methode namens 'managedObjectContext', die diese Variable zurückgibt.

    
Mr. Cairo 25.09.2009 03:04
quelle