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:
reloadRowsAtIndexPaths
für die richtige Zelle auf, so dass das korrekte Bild anstelle des Platzhalterbildes eingeblendet wird. 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%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:
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
.
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:
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.)
Ich benutze das:
%Vor%Sie können es verwenden, bevor Sie die Zelle neu laden. Die Tabellenansicht scrollt beim Laden der Zelle nicht.
Tags und Links objective-c iphone uitableview