Frage

In UICollectionView versuche ich zu verwenden performBatchUpdates:completion um Aktualisierungen an meiner Rasteransicht durchzuführen.Mein Datenquellenarray ist 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 dessen, was ich habe / was ich tue:

Dieser Code läuft einwandfrei, wenn das erste Einfügen in die Sammlungsansicht abgeschlossen ist.Wenn ich jedoch weitere Daten zu meiner Sammlungsansicht hinzufüge / einfüge (durch Aktualisieren self.results und dies aufzurufen), gibt dies den folgenden Fehler aus:

* Beenden der App aufgrund einer nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund:'Ungültige Aktualisierung:ungültig anzahl der Elemente in Abschnitt 0.Die Anzahl der Elemente, die in einem enthalten sind vorhandener Abschnitt nach dem Update (8) muss gleich der Anzahl der elemente, die in diesem Abschnitt vor der Aktualisierung enthalten waren (4), plus oder minus die Anzahl der Elemente, die in diesen Abschnitt eingefügt oder gelöscht wurden (32 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der Elemente, in die verschoben wurde oder aus diesem Abschnitt (0 eingezogen, 0 ausgezogen).'

Ich verstehe, dass dies bedeutet, dass die Datenquelle nicht ordnungsgemäß aktualisiert wurde.Bei der Abfrage meiner self.results array, ich sehe die neue Anzahl der Daten.Ich mache das in der ersten Zeile mit addObjectsFromArray.Ich habe auch die alte Ergebnisgröße in gespeichert resultsSize.Ich benutze diese Variable, um die neu hinzugefügten Indexpfade hinzuzufügen arrayWithIndexPaths.

Beim Hinzufügen / Einfügen von Elementen habe ich jetzt die folgenden for-Schleifen ausprobiert:

for (id obj in self.results) welches ist, was ich jetzt benutze.Es funktioniert anfangs, aber weitere Einfügungen stürzen ab.

for (UIImage *image in newData) funktioniert anfangs auch, aber weitere Einfügungen stürzen ab.

Aus dem Namen der Funktion glaube ich das insertItemsAtIndexPaths fügt alle Elemente an diesen Indexpfaden ohne Schleife ein.Ohne Schleife stürzt die App jedoch ab, wenn sie anfänglich versucht, die Daten aufzufüllen.

Ich habe auch versucht, von zu schleifen resultsSize + 1 bis zum neuen self.results count (das die neuen Daten enthält) und das stürzt auch beim ersten Update ab.

Irgendwelche Vorschläge, was ich falsch mache?

Danke,

War es hilfreich?

Lösung

Ich sehe hier mehrere Dinge falsch.Erstens bin ich mir nicht sicher, warum Sie dispatch_sync verwenden, ich habe nicht viel Erfahrung mit GCD und konnte es damit nicht zum Laufen bringen (es schien zu hängen und die Benutzeroberfläche reagierte nicht).Vielleicht kann jemand anderes dabei helfen.Zweitens durchlaufen Sie in der Schleife, in der Sie Indexpfade hinzufügen, resultsSize , was meines Wissens die Größe des Arrays vor der Aktualisierung ist, was nicht Ihren Wünschen entspricht - Sie möchten die neuen Indizes starten bei resultsSize und Schleife bis zu resultsSize + newData .zählen.Wenn Sie insertItemsAtIndexPaths aufrufen, möchten Sie dies schließlich einmal tun, nicht in einer Schleife.Ich habe es versucht und es hat funktioniert, um die Sammlungsansicht zu aktualisieren (ich habe es nicht von Grund auf mit einer leeren Sammlungsansicht versucht):

-(void)addNewCells {
    [self.collectionView performBatchUpdates:^{
        int resultsSize = [self.results count];
        [self.results addObjectsFromArray:newData];
        NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];
        for (int i = resultsSize; i < resultsSize + newData.count; i++) {
            [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
        }
            [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
    }
        completion:nil];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top