TableView mit zwei Instanzen von NSFetchedResultsController

8

Nach Tagen der Recherche und der Umcodierung bin ich ziemlich ratlos. Mein Ziel ist es, eine Testanwendung mit einer einzelnen Tabellenansicht aus zwei separaten abgerufenenResultControllern auszuführen.

Ich habe eine Reihe von Artikeln auf einer Einkaufsliste, jede mit einer Abteilung und einer booleschen "gesammelten" Flagge. Nicht abgeholte Artikel sollten nach Abteilung aufgelistet werden, gefolgt von einem einzelnen Abschnitt mit allen gesammelten Artikeln (unabhängig von der Abteilung). Wenn ein Benutzer nicht abgeholte Elemente abruft, sollte er in den Bereich "Gesammelt" wechseln. Wenn er ein gesammeltes Objekt abmeldet, sollte es in seine richtige Abteilung zurückkehren.

Um den ersten Teil (nicht abgeholte Elemente) zu erreichen, habe ich einen einfachen fetchedResultsController eingerichtet, der alle gesammelten Elemente = NEIN holt und die Ergebnisse nach Abteilung sortiert:

%Vor%

Ich setze die Anzahl der Zeilen, Abschnitte und Abschnittsüberschriften wie folgt:

%Vor%

Ich benutze auch die Boilerplate controllerWillChangeContent, didChangeObject und controllerDidChangeContent, um Zellen hinzuzufügen oder zu entfernen, wenn sich die FRC ändert.

Aus Gründen der Kürze werde ich den Code für die Anzeige der Zelle nicht einschließen, aber ich ziehe im Wesentlichen das richtige Element basierend auf dem Indexpfad der Zelle, setze den Text / den Untertitel der Zelle und befestige je eines von zwei Häkchenbildern ob der Artikel abgeholt wurde oder nicht. Ich verdrahte auch dieses Bild (das auf einer Taste ist), um von geprüft zu unmarkiert zu schalten, wenn es berührt wird, und den Gegenstand dementsprechend zu aktualisieren.

Dieser Teil funktioniert alles gut. Ich kann meine Liste der Elemente nach Abteilung anzeigen, und wenn ich eins als gesammelt markiert habe, sehe ich, dass es wie erwartet von der Liste abfällt.

Nun habe ich versucht, den unteren Abschnitt hinzuzufügen, der alle gesammelten Elemente enthält (in einem einzigen Abschnitt). Zuerst richte ich einen zweiten holeResultsConroller ein, diesmal um nur nicht abgeholte Objekte zu holen und ohne Schnitte. Ich musste auch Folgendes aktualisieren:

%Vor%

Ich habe dann den cellForRowAtIndexPath auf ähnliche Weise aktualisiert, so dass das von mir abgerufene Element vom richtigen FRC kommt:

%Vor%

Das funktioniert großartig, wenn ich starte. Die Tabellenansicht wird genau wie erwartet angezeigt:

Das Problem (endlich)

Das (erste) Problem tritt auf, wenn ich das Häkchen für ein nicht abgeholtes Objekt anwähle. Ich erwarte, dass der Artikel aus der Abteilung, in der er aufgeführt ist, entfernt und in den Abschnitt "Gesammelt" verschoben wird. Stattdessen bekomme ich:

  

CoreData: Fehler: Schwerwiegender Anwendungsfehler. Eine Ausnahme wurde abgefangen   von dem Delegat von NSFetchedResultsController während eines Aufrufs an   -controllerDidChangeContent :. Ungültige Aktualisierung: ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt   nach dem Update (2) muss gleich der Anzahl der Zeilen in enthalten sein   dieser Abschnitt vor dem Update (2) plus oder minus der Anzahl der Zeilen   eingefügt oder aus diesem Abschnitt gelöscht (1 eingefügt, 0 gelöscht) und Plus   oder minus die Anzahl der Zeilen, die in diesen Abschnitt hinein oder aus ihm heraus verschoben wurden (0 verschoben)   in, 0 ausgezogen). mit userInfo (null)

Wenn ich das Gegenteil versuche, erhalte ich einen anderen Fehler:

  

* Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSRangeException', Grund: '* - [__ NSArrayM objectAtIndex:]: Index 2 über Grenzen [0 ..   1] '

Ich vermute, dass es in beiden Fällen ein Problem mit der Konsistenz der Anzahl der Abschnitte / Zeilen in den FRCs und der Tabellenansicht gibt, wenn sich ein Element von einem FRC zum anderen bewegt. Obwohl dieser zweite Fehler mich glauben lässt, dass es vielleicht ein einfacheres Problem gibt, das mit dem Abrufen von Elementen zusammenhängt.

Jede Richtung oder Ideen würden geschätzt werden. Ich kann mehr von meinem Code zur Verfügung stellen, wenn es helfen würde, und ich habe auch eine kleine Test-App mit einer einzigen Ansicht erstellt, um das Problem zu demonstrieren. Ich kann es bei Bedarf hochladen, aber meistens wollte ich das Problem in einer kleinen Sandbox testen.

Update - zusätzlicher Code angefordert

Wie gewünscht, geschieht dies, wenn ein Häkchen berührt wird:

%Vor%     
Ben Packard 25.01.2012, 03:06
quelle

2 Antworten

6

Nun, ich denke, ich könnte es geknackt haben. Wie es oft der Fall ist, hat es mich in die richtige Richtung gelenkt, es zu strippen und nur ein paar Kommentare zu lesen.

Wenn ich zur Delegate-Methode controllerDidChangeObject komme, versuche ich eine Zeile in den bereitgestellten indexPath einzufügen (für das 'checked' Element). Abgesehen davon, dass dieser indexPath beim Einfügen in meinen zusätzlichen Abschnitt keine Kenntnis darüber hat, dass es davor noch eine Menge anderer Abschnitte gibt. So erhält es Abschnitt 0 und versucht dort einzufügen. Wenn der IndexPath stattdessen von der zweiten FRC kommt, sollte ich die Abschnittsnummer um die Anzahl der Abschnitte in der ersten FRC-Tabelle erhöhen. Also habe ich ersetzt:

%Vor%

mit

%Vor%

Ich muss dies für jeden von einfügen, löschen, aktualisieren usw. tun. Ich werde dies als die Antwort markieren, nachdem ich dies validiert habe und Zeit für andere Kommentare lasse.

    
Ben Packard 25.01.2012, 16:25
quelle
0

Die Fehler, die Sie sehen, bedeuten, dass sich Ihre UITableView vor BEIDE NSFetchedResultsController s neu lädt. Die Codes, die du gepostet hast, sind wahrscheinlich richtig. Ich vermute, dass das Problem in einer der Methoden NSFetchedResultsControllerDelegate ist.

    
John Estropia 25.01.2012 08:04
quelle