Wie kann ich diesen Absturz von CollectionView lösen?

8

Meine App hat zwei CollectionViewController s. Nur eine ist zu einer bestimmten Zeit sichtbar.

Ich habe die folgende Struktur auf dem Storyboard erstellt: zwei Containeransichten übereinander. In jeder Containeransicht ist ein CollectionViewController eingebettet. Die Sichtbarkeit einer bestimmten Containeransicht bestimmt, welche AuflistungViewController sichtbar ist.

Das ist das Problem. Beide CollectionViewController s empfangen Daten parallel, aber iOS hat einen Fehler, der die App zum Absturz bringt, wenn ein CollectionViewController versucht, eine Einfügung mit performBatchUpdates auszuführen, während sie unsichtbar ist.

Um das zu verhindern, habe ich ein BOOL-Flag auf beiden CollectionViewController s erstellt, damit sie wissen können, ob sie sichtbar sind und das performBatchUpdates ausführen oder nicht. Etwas wie:

%Vor%

Dies löst einen Teil des Problems. Aber die App stürzt weiterhin unter folgender Bedingung ab: Wenn ich auf die Schaltfläche tippe, um zur unsichtbaren CollectionViewController zu wechseln, wird sie sichtbar, während sie Updates erhält.

Ich meine das: Lassen Sie uns A die erste CollectionViewController und B die zweite nennen. A ist sichtbar und B ist zu diesem Zeitpunkt nicht sichtbar. B beginnt mit dem Empfang von Daten und versucht, performBatchUpdates auszuführen, aber da es unsichtbar ist, verhindert if (self.isThisCollectionViewVisible == NO) return; das Ausführen von performBatchUpdates , was in Ordnung ist. Jetzt mache ich A unsichtbar und B sichtbar. An diesem Punkt wird das Flag self.isThisCollectionViewVisible auf YES gesetzt und performBatchUpdates bringt die App zum Absturz mit diesem Fehler:

  

* Assertionsfehler in - [CollectionView _endItemAnimationsWithInvalidationContext: vorläufig für die Reihenfolge:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.7/UICollectionView.m:4625   * Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'Ungültige Aktualisierung: ungültig   Anzahl der Elemente in Abschnitt 0. Die Anzahl der Elemente in einem   existierender Abschnitt nach der Aktualisierung (76) muss gleich der Anzahl von sein   Elemente in diesem Abschnitt vor dem Update (70), plus oder minus   die Anzahl der Elemente, die in diesem Abschnitt eingefügt oder gelöscht wurden (5 eingefügt,   2 gelöscht) und plus oder minus der Anzahl der Objekte, in oder aus denen verschoben wird   dieser Abschnitt (0 eingezogen, 0 ausgezogen). '

Ich denke, die CollectionViewController ist wirklich noch nicht fertig und aktualisiert, um eine performBatchUpdates machen zu können ... und das ist keine Sache, die Datenquelle vorher nicht zu aktualisieren, weil sie aktualisiert wird.

Was kann ich tun, um dies zu verhindern?

HINWEIS: Mir ist gerade an diesem Absturz etwas Seltsames aufgefallen. Es heißt, dass 5 Elemente eingefügt und 2 gelöscht werden, aber tatsächlich werden 3 Elemente eingefügt, 0 gelöscht und 2 geändert, wenn die Abstürze passieren.

    
SpaceDog 31.03.2016, 12:59
quelle

3 Antworten

11

Das Hinzufügen von self.collectionView.numberOfItemsInSection(0) hat den Absturz behoben. Die Auflistungsansicht hat Probleme beim Einfügen von Elementen, wenn sie nicht sichtbar ist.

Scheint so, als wäre ich nicht alleine mit meiner Lösung: Ссылка

    
João Nunes 19.05.2016, 12:50
quelle
2

Dieser Absturz hat Ihnen mitgeteilt, dass Sie Ihre Datenquelle nicht zum Sammeln aktualisiert haben. Sie müssen Ihre dataSource (Array oder Dictionary) aktualisieren und Sammlungsansichtsdaten erneut laden, nachdem Sie performBatchUpdates ausgeführt haben.

Ungültiges Update: ungültige Anzahl der Elemente in Abschnitt 0. Die Anzahl der Elemente in einem vorhandenen Abschnitt nach der Aktualisierung (76) muss gleich der Anzahl der Elemente in diesem Abschnitt vor der Aktualisierung (70) plus oder sein abzüglich der Anzahl der Elemente, die in diesem Bereich eingefügt oder gelöscht wurden (5 eingefügte, 2 gelöschte) und plus oder minus der Anzahl der Elemente, die in diesen Bereich hinein oder aus diesem heraus bewegt wurden (0 eingezogen, 0 ausgezogen). '

Wie in Apple Docs geschrieben

  

Löschvorgänge werden vor Einfügungen in Stapelverarbeitungsvorgängen verarbeitet. Das heisst   Die Indizes für die Löschungen werden relativ zu den Indizes von verarbeitet   der Status der Sammlungsansicht vor der Stapelverarbeitung und der   Indizes für die Einfügungen werden relativ zu den Indizes von verarbeitet   der Zustand nach allen Löschvorgängen im Stapelbetrieb.

Also, verschiebe die Änderungen vor den Einfügungen und es wird der Trick!

    
Karaban 31.03.2016 13:18
quelle
0

Heute ist der gleiche Fehler aufgetreten. Ersetzen Sie dies im Block performBatchUpdates:

%Vor%

mit diesem:

%Vor%

Pflegen Sie den Index selbst, es ist jetzt in Ordnung. Der Fehler sollte nicht mit der Datenquelle verknüpft sein, wenn Sie die Datenquelle aktualisiert haben. Es kann sich auf die Wiederverwendung von Zellen beziehen.

    
Hongli Yu 25.05.2016 09:50
quelle