Durch den Aufruf von reloadRowsAtIndexPaths wird das TableView contentOffset entfernt

8

Immer wenn ich anrufe

%Vor%

Mein UITableView contentOffset wird entfernt, gibt es eine Delegate-Methode, die ich verwenden kann, um die Aktualisierung der Tabellenansicht abzufangen, und den Offset erneut einzustellen, damit er an Ort und Stelle bleibt und nicht in den View animiert wird oder einfach verhindert?

Ich setze das contentOffest in viewDidLoad:

%Vor%

Hier ist eine Beispielverwendung:

%Vor%

Dadurch wird contentOffset entfernt und in die Ansicht animiert, was ich nicht möchte.

Genauer gesagt scheint dies aufzutreten, wenn die neu zu ladende Zeile bei indexPath.section 0 und indexPath.row 0 liegt, d. h. in der obersten Zeile.

Weitere Informationen

Ich rufe nach einer asynchronen Anfrage reloadRowsAtIndexPaths auf, um ein Image von einem Server zu holen. Es funktioniert grundsätzlich so:

  • cellForRowAtIndexPath wird aufgerufen, der nach dem Vorhandensein der Daumendatei auf dem Datenträger sucht. Wenn die Datei nicht vorhanden ist, wird ein Platzhalter an seiner Stelle geladen und eine asynchrone Anforderung in einem Hintergrundthread gestartet, um das Bild abzurufen.
  • Wenn der Bild-Download abgeschlossen ist, rufe ich reloadRowsAtIndexPaths für die richtige Zelle auf, so dass das korrekte Bild anstelle des Platzhalterbildes eingeblendet wird.
  • Die Anzahl der Zellen kann unterschiedlich sein, wenn die Anforderung innerhalb von cellForRowAtIndexPath aufgerufen wird, damit die Bilder geladen werden, wenn die Zellen geladen werden.

cellForRowAtIndexPath-Dateiüberprüfung

%Vor%

Datei heruntergeladene Benachrichtigung:

%Vor%

Cell reload (Ich habe Abschnitte aufgrund eines Fehlers hart codiert, wobei seltsame Abschnittsnummern sehr selten übergeben wurden, was zu einem Absturz führte:

%Vor%     
Alex 24.05.2011, 14:28
quelle

5 Antworten

2

EDIT: Meine ursprüngliche Antwort hat sich vielleicht nicht auf das Kernproblem konzentriert

Ändern Sie die Anzahl der Zeilen vor dem Aufruf von reloadRows... ? reloadRows... dient speziell dazu, eine Wertänderung zu animieren, daher sollte Ihr Code etwa so aussehen:

%Vor%

Sehen Sie mehr oder weniger so aus, aber die Tabellenansicht vergisst, wo sie ist?

Vorherige Diskussion

Sie rufen -beginUpdates und -endUpdates nicht bei einem Reload auf. Sie rufen -beginUpdates und -endUpdates um die zugehörigen Änderungen der Backing-Daten auf, während denen Sie -insertRowsAtIndexPaths:withRowAnimation: und seine Verwandten aufrufen sollten. Wenn Sie die Aktualisierungsroutinen aufrufen, müssen Sie die Reload-Routinen nicht aufrufen. Das Neuladen in der Mitte eines Updates ist ein nicht definiertes Verhalten.

Siehe Einfügen, Löschen und erneutes Laden von Zeilen und Abschnitten im Stapel für Details zur Verwendung von -beginUpdates .

    
Rob Napier 24.05.2011, 14:42
quelle
3

Klingt so, als würden Sie aufgrund falsch geschätzter Zeilenhöhen auf dieses Problem stoßen. Weil (aus irgendeinem mysteriösen Grund) die Tabellenansicht den neuen Offset bestimmt, nachdem einige Zellen mit der geschätzten Zeilenhöhe neu geladen wurden möchten Sie sicherstellen, dass tableView:estimatedHeightForRowAtIndexPath korrekte Daten für Zellen liefert, die bereits gerendert wurden. Um dies zu erreichen, können Sie die angezeigten Zeilenhöhen in einem Wörterbuch zwischenspeichern:

%Vor%

Verwenden Sie dann diese korrekten Daten oder Ihre Schätzung für nicht bereits geladene Zellen:

%Vor%

(RIESIG dank eyuelt für die Erkenntnis, dass die geschätzte Zeilenhöhe verwendet wird, um den neuen Offset zu bestimmen.)

    
Daniel Schlaug 19.06.2016 14:26
quelle
0

Haben Sie Folgendes versucht:

%Vor%

Das scheint ein wenig zu trivial, nicht sicher, es würde funktionieren, aber einen Versuch wert.

    
octy 24.05.2011 15:14
quelle
0

Ersetzen

%Vor%

mit

%Vor%

und es wird gut sein.

    
Henry Cheung 17.04.2016 07:04
quelle
0

Ich benutze das:

%Vor%

Sie können es verwenden, bevor Sie die Zelle neu laden. Die Tabellenansicht scrollt beim Laden der Zelle nicht.

    
user6492974 06.09.2016 02:29
quelle

Tags und Links