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:
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.
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: Ссылка
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!
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.
Tags und Links iphone ios uicollectionview performbatchupdates