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?

23voto

Alessandro Ornano Punkte 33106

Mauersegler 4 :

Das funktioniert sehr gut:

//self.tableView.reloadData() if you want to use this line remember to put it before 
let indexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)

22voto

ScottyBlades Punkte 9468

NICHT VERWENDEN

 tableView.setContentOffset(.zero, animated: true)

Dabei kann es vorkommen, dass der Offset nicht korrekt eingestellt wird. In meinem Fall zum Beispiel lag die Zelle tatsächlich etwas über der Ansicht mit den Einschüben des sicheren Bereichs. Das ist nicht gut.

VERWENDEN SIE STATTDESSEN

 tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)

19voto

Adrian Punkte 15661

Ich bin auf ein Problem gestoßen, das auftritt, wenn ich einige der Methoden an einem leeren tableView . Hier ist eine weitere Option für Swift 4, die leere tableviews behandelt.

extension UITableView {
  func hasRowAtIndexPath(indexPath: IndexPath) -> Bool {
    return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
  }

  func scrollToTop(animated: Bool) {
    let indexPath = IndexPath(row: 0, section: 0)
    if self.hasRowAtIndexPath(indexPath: indexPath) {
      self.scrollToRow(at: indexPath, at: .top, animated: animated)
    }
  }
}

Uso:

// from yourViewController or yourTableViewController
tableView.scrollToTop(animated: true)//or false

12voto

Eran Goldin Punkte 955

Für Tabellen, die eine contentInset und setzt den Inhaltsoffset auf CGPointZero wird nicht funktionieren. Es wird an den oberen Rand des Inhalts und nicht an den oberen Rand der Tabelle gescrollt.

Die Berücksichtigung des Inhaltseinsatzes führt stattdessen zu diesem Ergebnis:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];

10voto

Ramesh Muthe Punkte 801

Mit diesem Code können Sie einen bestimmten Abschnitt nach oben scrollen

CGRect cellRect = [tableinstance rectForSection:section];
CGPoint origin = [tableinstacne convertPoint:cellRect.origin 
                                    fromView:<tableistance>];
[tableinstance setContentOffset:CGPointMake(0, origin.y)];

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