420 Stimmen

UITableView - nach oben blättern

In meiner Tabellenansicht muss ich nach oben scrollen. Aber ich kann nicht garantieren, dass das erste Objekt Abschnitt 0, Zeile 0 sein wird. Es kann sein, dass meine Tabellenansicht mit Abschnitt Nummer 5 beginnt.

Ich erhalte also eine Ausnahme, wenn ich anrufe:

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

Gibt es eine andere Möglichkeit, in der Tabellenansicht nach oben zu blättern?

10voto

liquid Punkte 10157

Swift 5, iOS 13

Ich weiß, dass es auf diese Frage schon viele Antworten gibt, aber meiner Erfahrung nach funktioniert diese Methode immer:

let last = IndexPath(row: someArray.count - 1, section: 0)
tableView.scrollToRow(at: last, at: .bottom, animated: true)

Dies gilt insbesondere, wenn Sie mit Animationen (wie z. B. der Tastatur) oder bestimmten asynchronen Aufgaben arbeiten - die anderen Antworten werden oft zur fast unten. Wenn Sie aus irgendeinem Grund nicht bis ganz nach unten gelangen, liegt das mit ziemlicher Sicherheit an einer konkurrierenden Animation, so dass die Abhilfe darin besteht, diese Animation an das Ende der Hauptwarteschlange zu schicken:

DispatchQueue.main.async {
    let last = IndexPath(row: self.someArray.count - 1, section: 0)
    self.tableView.scrollToRow(at: last, at: .bottom, animated: true)
}

Dies mag überflüssig erscheinen, da Sie sich bereits in der Hauptwarteschlange befinden, ist es aber nicht, da es die Animationen serialisiert.

8voto

Esqarrouth Punkte 36621

Schnell:

tableView.setContentOffset(CGPointZero, animated: true)

8voto

Kerim Khasbulatov Punkte 662

Swift 3

tableView.setContentOffset(CGPoint.zero, animated: true)

si tableView.setContentOffset funktionieren nicht.

Úsalo:

tableView.beginUpdates()
tableView.setContentOffset(CGPoint.zero, animated: true)
tableView.endUpdates()

7voto

budiDino Punkte 12048

Da mein tableView ist voll von allen möglichen Einsätzen, aber das war das Einzige, was gut funktioniert hat:

Swift 3

if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 {
  tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
}

Mauersegler 2

if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 {
  tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true)
}

7voto

ocwang Punkte 654

Zusätzlich zu dem, was bereits gesagt wurde, können Sie eine Erweiterung (Swift) oder Kategorie (Objective C) erstellen, um dies in Zukunft zu vereinfachen:

Schnell:

extension UITableView {
    func scrollToTop(animated: Bool) {
        setContentOffset(CGPointZero, animated: animated)
    }
}

Jedes Mal, wenn Sie eine beliebige tableView nach oben scrollen wollen, können Sie den folgenden Code aufrufen:

tableView.scrollToTop(animated: true)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X