insertItemsAtIndexPaths Update-Fehler
In UICollectionView, ich bin versucht, performBatchUpdates:completion
updates durchführen, um meine grid-Ansicht. Meine Daten Quell-array self.results
.
Hier ist mein code:
dispatch_sync(dispatch_get_main_queue(), ^{
[self.collectionView performBatchUpdates:^{
int resultsSize = [self.results count];
[self.results addObjectsFromArray:newData];
NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
if (resultsSize == 0) {
[arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:0 inSection:0]];
}
else {
for (int i = 0; i < resultsSize; i++) {
[arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:resultsSize + i inSection:0]];
}
}
for (id obj in self.results)
[self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
} completion:nil];
Erklärung, was ich habe /was ich mache:
Dieser code läuft gut, wenn die erste Aufnahme in der Ansicht Sammlung ist fertig. Wenn ich jedoch hinzufügen/fügen Sie mehr Daten in meine Sammlung anzeigen (durch Aktualisierung self.results
und diese aufrufen), diese gibt die folgende Fehlermeldung:
* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Ungültiges update: ungültige
Anzahl der Elemente in Abschnitt 0. Die Anzahl der Elemente, die in einer
bestehenden Abschnitt nach dem update (8) muss gleich der Anzahl der
enthaltene Elemente in diesem Abschnitt, bevor Sie das update (4), plus oder minus
die Anzahl der Elemente, die eingefügt oder gelöscht, der Abschnitt (32
eingefügt, gelöscht 0) und plus oder minus die Anzahl der Elemente verschoben in
oder aus diesem Bereich (0 verschoben, 0 verschoben).'
Ich verstehe dies bedeutet, dass die Datenquelle nicht aktualisiert wurde ordnungsgemäß. Aber beim Abfragen meiner self.results
array, sehe ich die neue Zählung der Daten. Ich mache auf der ersten Linie, die mit addObjectsFromArray
. Ich habe auch gespeichert, die alten Ergebnisse Größe in resultsSize
. Ich benutze diese variable hinzufügen, um den neu hinzugefügten index-Pfade in arrayWithIndexPaths
.
Nun beim hinzufügen/einfügen von posten, ich habe versucht, die folgenden for-Schleifen:
for (id obj in self.results)
was ich nun benutze. Es funktioniert zunächst aber weitere Einsätze abstürzt.
for (UIImage *image in newData)
so gut funktioniert zunächst aber weitere Einsätze crash.
Vom Namen der Funktion, ich glaube, dass insertItemsAtIndexPaths
wird, legen Sie alle Elemente auf diese index-Pfaden, ohne eine Schleife. Jedoch, ohne eine Schleife, die app stürzt ab, wenn er zunächst versucht, füllen Sie die Daten.
Ich habe auch versucht looping aus resultsSize + 1
bis der neue self.results
count (enthält die neuen Daten) und stürzt bei der ersten update.
Irgendwelche Vorschläge, was ich falsch mache?
Danke,
InformationsquelleAutor darksky | 2012-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich sehe einige Dinge hier falsch. Erstens, ich bin nicht sicher, warum bist du mit dispatch_sync, ich habe nicht viel Erfahrung mit GCD, und ich konnte es nicht schaffen, arbeiten Sie mit, in es (es schien zu hängen, und die UI war nicht mehr reagiert). Vielleicht kann jemand anders helfen. Zweitens, in der Schleife, wo Sie fügen Sie index-Pfade, Sie sind Schleifen über resultsSize, die wie ich es verstehe, ist die Größe des Arrays vor dem update, das ist nicht, was Sie wollen-Sie wollen zu Beginn der neuen Indizes bei resultsSize und Schleife bis zu resultsSize + newData.zählen. Schließlich, wenn Sie anrufen insertItemsAtIndexPaths, Sie wollen, dass Sie einmal nicht in einer Schleife. Ich versuchte dies und es funktionierte zum aktualisieren der Ansicht Sammlung (ich habe nicht versucht, es von Grund auf mit einem leeren collection view):
The number of items contained in an existing section after the update (4) must be equal to the number of items contained in that section before the update (0), plus or minus the number of items inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'
Wie gesagt, ich habe nicht versucht, diese ab rom eine leere Sammlung anzeigen. Im test ist resultsSize = 0? Es scheint mir, dass, wenn es ist, sollten Sie loszuwerden, die if-else-Klausel und nur der else-Teil gibt-ich glaube, das würde dann die Arbeit von einem leeren array. Ich habe meinen Beitrag aktualisiert, um zu zeigen, wie ich denke, sollte es funktionieren.
Super!!! Es arbeitete. Vielen Dank. Eine Frage jedoch, da Sie scheinen schon bekommen UICollectionViews arbeiten programmatisch: im landscape-Modus scheint es nicht nach unten scrollen, beim hinzufügen von neuen Elementen. Wie gehst du mit der Erweiterung der Sammlung-Ansicht scrollen, wenn neue Elemente Hinzugefügt werden? Würde das zurücksetzen der frame ist die Höhe, jedes mal, wenn ein Element Hinzugefügt wird? Wenn ja, wie würden Sie tun, um Platz für sowohl hoch-und Querformat?
Ich habe nicht versucht, die rotation noch-ich erinnere mich an etwas von der WWDC 2012 über, die werde ich haben, check it out und erhalten Sie zurück.
Ich bin mir nicht sicher, was du meinst mit "es scheint nicht, um nach unten zu Blättern, wenn Sie neue Elemente hinzufügen" Werden Sie nicht immer scrollen im landscape-Modus, weil ich bin? Ich habe nicht Hinzugefügt jede code, um mit viel rotation, aber es scheint der Standard sein.
InformationsquelleAutor rdelmar