一尘不染

iOS TableView重新加载并滚动到顶部

swift

第二天我不能用桌子解决问题。

我们有一个segmentedControl,它在更改时会更改表。假设控件段中有3个元素,并且相应地,有3个数组(重要的是,它们的大小不同),在更改segmentedControl时,我需要向上滚动表。

看起来一切都很简单:contentOffset = .zero和reloadData()

但。这行不通,我不知道为什么表格不能向上滚动。

唯一有效的方法:

UIView.animate (withDuration: 0.1, animations: {
            self.tableView.contentOffset = .zero
        }) {(_) in
            self.tableView.reloadData ()
}

但是现在当表上升时还有另一个问题,因为segmentedControl已经更改,并且另一个数组中的数据可能没有更改,所以可能会发生错误,我们尚未完成reloadData()

也许我不明白明显的事情))恭喜即将到来的假期!


阅读 331

收藏
2020-07-07

共1个答案

一尘不染

UItableView方法scrollToRow(at:at:animated
:)
滚动浏览表视图,直到由索引路径标识的行位于屏幕上的特定位置。

tableView.scroll(to: .top, animated: true)

你可以用我的扩展名

extension UITableView {

    public func reloadData(_ completion: @escaping ()->()) {
        UIView.animate(withDuration: 0, animations: {
            self.reloadData()
        }, completion:{ _ in
            completion()
        })
    }

    func scroll(to: scrollsTo, animated: Bool) {
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)) {
            let numberOfSections = self.numberOfSections
            let numberOfRows = self.numberOfRows(inSection: numberOfSections-1)
            switch to{
            case .top:
                if numberOfRows > 0 {
                     let indexPath = IndexPath(row: 0, section: 0)
                     self.scrollToRow(at: indexPath, at: .top, animated: animated)
                }
                break
            case .bottom:
                if numberOfRows > 0 {
                    let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1))
                    self.scrollToRow(at: indexPath, at: .bottom, animated: animated)
                }
                break
            }
        }
    }

    enum scrollsTo {
        case top,bottom
    }
}
2020-07-07