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?

6voto

dengST30 Punkte 2825

In Swift 5 , Vielen Dank @Adrian's Antwort

extension UITableView{

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

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

}

Uso:

tableView.scrollToTop()

6voto

jacob Punkte 3412

Ich bevorzuge die folgende Variante, da sie einen Einschub berücksichtigt. Wenn es keinen Einschub gibt, wird trotzdem nach oben geblättert, da der Einschub 0 ist.

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)

5voto

jmcastel Punkte 1365

Mauersegler :

wenn Sie keine tableView-Kopfzeile haben:

tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

wenn ja :

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height   + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

4voto

Hans Brende Punkte 6821

Hier ist, was ich verwenden, um korrekt auf iOS 11 arbeiten:

extension UIScrollView {
    func scrollToTop(animated: Bool) {
        var offset = contentOffset
        if #available(iOS 11, *) {
            offset.y = -adjustedContentInset.top
        } else {
            offset.y = -contentInset.top
        }
        setContentOffset(offset, animated: animated)
    }
}

3voto

jimmyruby Punkte 73

Dies war der einzige Codeschnipsel, der bei mir funktionierte

Mauersegler 4:

    tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
    tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
    tableView.setContentOffset(CGPoint(x: 0, y: -70), animated: true)

P.S. 70 ist die Höhe meiner Kopfzeile und der Zelle der Tabellenansicht

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