UITableView verarbeitet contentOffset beim Scrollen / Paging nicht korrekt

9

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:

Ссылка

    
TIMEX 18.09.2017, 18:57
quelle

2 Antworten

1

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

haben

Im Grunde haben Sie es mit zwei Problemen zu tun:

  1. InhaltOffset

  2. 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%
  • Entscheiden Sie, wie viel Höhenpuffer Sie behalten müssen, wenn die Bildlauffunktion deaktiviert wird. Dieser Höhenpuffer ist die Höhe, nach der Sie entscheiden, weitere Elemente (25) in die Datenquelle einzufügen.
  • An dieser Stelle müssen Sie nun Elemente von oben entfernen
  • Wenn Sie einen Gegenstand von oben entfernen, sagen Sie scrollView im Prinzip, dass der Inhalt um dieselbe Höhe reduziert wird.
  • 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

manismku 28.09.2017, 16:14
quelle
2

Von Ihrem Beispielprojekt kann ich Folgendes verstehen,

  • Eine Sache ist, dass Sie die Leistung Ihrer Tabellenansicht erhöhen möchten, indem Sie nur eine kleine Anzahl von Zellen gleichzeitig laden
  • Ihre zweite Sorge ist manchmal, dass Sie die Tabellenansicht mit Daten laden möchten, die zufällig im Datenquellen-Array
  • platziert sind

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,

Ссылка

    
arunjos007 22.09.2017 12:52
quelle

Tags und Links