Ich habe eine Tabellenansicht über sehr große Datenmengen. Aus Leistungsgründen kann es nicht auf einmal geladen werden. Mehr, manchmal zufälliger Ort des Arrays sollte geladen werden, so inkrementelle Paginierung ist keine gute Option.
Die aktuelle Lösung für diese Anforderungen ist das Verschieben des Fensters über das Datenfeld. Während der Benutzer scrollt, füge ich Zellen von einem Ende und entferne sie vom gegenüberliegenden Ende. Ich benutze Scroll-Position (indem ich sehe, welche Zellen auf dem Bildschirm angezeigt werden), um festzustellen, ob es Zeit ist, neue Daten zu laden.
Wenn Sie tableView.deleteRows(at:with:)
aufrufen und Zellen vom Anfang der Tabelle entfernen, passt tableView normalerweise die Eigenschaft contentOffset
so an, dass der Benutzer immer noch dieselben Zellen wie vor der Operation sieht.
Wenn TableView jedoch nach dem Scrollen verlangsamt wird, wird seine contentOffset
bei Aktualisierungen nicht angepasst, und dies führt dazu, dass neue Seiten immer wieder geladen werden, bis die Verzögerung abgeschlossen ist. Bei der ersten Aktualisierung nach der Verzögerung wird contentOffset
von tableView fixiert und das Laden wird gestoppt.
Das Gleiche passiert beim Zurückscrollen und Hinzufügen von Werten am Anfang der Tabelle mit tableView.insertRows(at:with:)
.
Wie kann ich sicherstellen, dass UITableView den contentOffset richtig anpasst?
ODER gibt es andere Möglichkeiten, diesen Fehler zu beheben - die Fähigkeit beibehalten, ein beliebiges Stück in der Mitte des Datenarrays zu laden und von diesem zu scrollen?
Ich habe ein kleines Projekt gemacht, das den Fehler illustriert:
Aus Ihrem Beispielprojekt kann ich verstehen, dass Sie versuchen, unendliches Scrollen durch das Fensterinhaltkonzept zu implementieren, so dass Sie immer eine feste Anzahl von Zeilen (Indexpfade, sagen wir 100) haben können, wenn das Fenster nach unten / oben scrollt - Tabellenansicht Entfernen Sie entsprechend indexPaths von oben / unten. Und obwohl Sie mehr Datenquellenelemente haben, können Sie immer tabellarische Ansicht von indexPfade 100
habenIm Grunde haben Sie es mit zwei Problemen zu tun:
InhaltOffset
Dynamische Höhe
Nehmen wir an, wir haben Höhe fixiert (44) und Tabelle ist nicht invertiert. Um Window für unendliches Scrollen zu implementieren, müssen Sie Folgendes tun:
%Vor%Auf diese Weise wird die gesamte Inhaltsgröße jedes Mal festgelegt
Ich hoffe, es wird helfen.
BEARBEITEN: - Hier ist der modifizierte Code, der am unteren Rand tatsächlich unendlich scrollt Tabellenansicht mit dynamischer Zellenhöhe. Dies erhöht die Anzahl der Zeilen nicht um mehr als 100, lädt aber trotzdem Daten im gleitenden Fenster. Link
Von Ihrem Beispielprojekt kann ich Folgendes verstehen,
Ich habe Ihren Code überprüft und Sie haben Ihre sliding-window over data-source model
sehr interessant implementiert. Das Problem, das durch Sie verursacht wurde, hatte versucht, tableview
effizient zu machen, indem Zellen entfernt und gelesen wurden.
Eigentlich sollte eine Zelle aus der Warteschlange genommen werden, um eine bereits im Speicher befindliche Zelle wiederzuverwenden. Bitte werfen Sie einen Blick auf die Apple-Dokumentation,
Aus Gründen der Leistung sollte die Datenquelle einer Tabellenansicht allgemein lauten Wiederverwendung von UITableViewCell-Objekten, wenn Zellen Zellen in Zeilen zugewiesen werden tableView (_: cellForRowAt :) Methode. Eine Tabellenansicht verwaltet eine Warteschlange oder Liste der UITableViewCell-Objekte, für die die Datenquelle markiert ist Wiederverwendung. Rufen Sie diese Methode von Ihrem Datenquellenobjekt auf, wenn Sie dazu aufgefordert werden Stellen Sie eine neue Zelle für die Tabellenansicht bereit. Diese Methode löscht a vorhandene Zelle, wenn eine verfügbar ist, oder erstellt eine neue Zelle mit der Klasse oder Nib-Datei, die Sie zuvor registriert haben. Wenn keine Zelle verfügbar ist Wiederverwendung und Sie haben keine Klasse oder Nib-Datei, diese Methode registriert gibt nil zurück.
Die gute Nachricht ist, dass Ihr sliding-window over data-source model
perfekt funktioniert, nachdem ich den Mechanismus zum Löschen und erneuten Lesen Ihrer Zeilen entfernt habe. Hier ist Ihr Arbeitscode,
Tags und Links uitableview ios uiscrollview