UITableView wieder auf die Beine nach oben in einem Abschnitt beim aufrufen reloadRowsAtIndexPaths
Wenn ein Benutzer auf eine Schaltfläche tippt, in einer meiner Zeilen ich bin eine Aktualisierung der zugrunde liegende Modell für die betreffende Zeile und rufen dann reloadRowsAtIndexPaths für die angegebene Zeile (D. H. eine einzige Zeile neu laden).
- (IBAction)handleCompleteTouchEvent:(UIButton *)sender {
NSIndexPath *indexPath = [self.tableView indexPathForView:sender];
id item = [self dataForIndexPath:indexPath];
if ([item respondsToSelector:@selector(completed)]) {
//toogle completed value
BOOL completed = ![[item valueForKey:@"completed"] boolValue];
[item setValue:[NSNumber numberWithBool:completed] forKey:@"completed"];
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
}
Das problem ist, dass die Tabelle-Ansicht springt zurück an die Spitze der Abschnitt nach diesem Anruf. Wie kann ich dies verhindern und halten Sie die scroll-position, wo es ist?
- Code sieht OK aus. Kannst du mehr code, der relevant sein kann für das problem? Gibt es irgendeine Stelle im code, wenn Sie Ihre view-controller, wo Sie anrufen
[self.tableView reloadData];
? - Ich fügte hinzu, mehr code zu zeigen, die gesamte Methode. Einmal reloadRowsAtIndexPaths ist aufgerufen, die Tabelle scrollt automatisch an die Spitze der Sektion, aber nur, wenn die Sektion header wird aus dem Bildschirm. Es ist nichts besonderes an der Zellbildung oder der Abschnitt header (nur ein string).
- Ich bin nicht durchführen jegliche reloadData oder etwas ähnliches. Auch, es gibt nichts in der Dokumentation zu Prellen nach oben in einem Abschnitt auf einer reloadRows. Ich habe nie bemerkt, diese Funktionalität vor, aber dann wieder ich don ' T haben in der Regel Daten, die wechselnden Aktionen innerhalb der Zelle selbst, so ist dies eine neue Art der Interaktion für mich.
- Versuchen Sie, überprüfen Sie den Wert der
indexPath
erhielt vonindexPathForView
. Kann es seinnil
. Wenn es also sein muss, wodurch scrollen nach oben. - die indexPath ist richtig. Es war das erste, was ich geprüft. Außerdem ist es nicht bounce nach oben in der Tabelle (0,0). Es prallt an den oberen Abschnitt (1,0).
- Dies ist sicher ein bug und noch nicht behoben !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ah Ha! Ich habe das problem gefunden und werde die Antwort auf meine eigene Frage, für die Arme Seele, führt in dieser Frage in der Zukunft.
Alle meine Zellen haben variable Höhe, so war ich mit dem neuen iOS7-Methode in UITableViewDelegate denken, es könnte beschleunigen render-Zeit (nicht, dass ich wirklich brauchte):
Sowieso implementieren diese Methode hat den bösen Nebeneffekt verursacht, den Tisch zu hüpfen, um den oberen Abschnitt beim aufrufen:
Lösen Sie die bounce-problem, das ich nur entfernt das überschreiben der estimatedHeightForRowAtIndexPath Methode und jetzt funktioniert alles wie es soll. Glücklich endlich.
estimatedRowHeight = tableView.rowHeight
imviewDidLoad
- und dies scheint ein wenig helfen. Ich bin auch mitUITableViewAutomaticDimension
.self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 200.0f;
auch funktioniertSollten Sie in der Lage, das zu tun, was Sie versuchen zu tun, durch die änderung der Inhalt der Zelle direkt. Zum Beispiel, wenn Sie mit der Basis
UITableViewCell
Klasse und die Daten in Ihrem Modell ist einNSString
denen Sie zeigen in der Tabelle Zelle, die Sie tun können, die folgenden (nachdem Sie Ihre Daten ändern Modell), anstatt zu telefonierenreloadRowsAtIndexPaths
:Wenn Sie eine benutzerdefinierte Unterklasse von UITableViewCell, es ist ungefähr das gleiche, außer für den Zugriff auf die Ansichten der Zelle erfolgt durch die contentView Eigenschaft.
Swift 4.2
Diese können überall arbeiten, die Sie entfernen möchten animation.
Beim laden der Tabelle Abschnitt oder eine Zeile
Diese hat den trick für mich.
Kann es möglich sein, legen Sie die Zelle in einem eigenen Abschnitt und rufen reload Abschnitt:
erscheint, beheben Sie das Problem teilweise. Nicht der sauberste Weg, aber es kann für Sie arbeiten.
In meinem ähnlichen Fall hatte ich zu zwicken die Implementierung der Methode
wo meine Höhen wurden zurückgesetzt. Also, statt zurücksetzen Höhe für jede Zelle, die ich aktualisiert nur die Kranken Zellen für reloadRowsAtIndexPaths nennen.
Wenn Sie wissen, dass die Mindesthöhe von Ihrem Handy, müssen Sie angeben, dass Sie während der Einstellung
estimatedRowHeight
. Ich war auf 1 festlegen, wie ich gelesen haben, bevor Sie irgendwo, dass jeder Wert über 0 würde genügen, der Zweck, sondern es war der Schuldige.Wenn ich es auf 44, das war die minimale Höhe meiner Zelle haben könnte, ging alles gut.
Dynamischen Höhen wurden auch gut funktioniert, keine Probleme mit diesem Update.
Bauen aus xsee Antwort -
Ich hatte die
Estimate
im interface builder auf "automatisch". Ich änderte diese auf eine andere Nummer und es begann zu arbeiten. Ich hieltRow Height
automatische.Ich hatte das gleiche Problem. Ich landete genau tableView aufrufen.reloadData() statt nach dem Update meine Daten /Zelle, und es hat nicht bounce zurück an die Spitze /Daten aktualisiert-in-place - FYI