iOS TableView重新加载并滚动顶部

第二天我无法用表解决问题。

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

似乎一切都很简单:contentOffset = .zero和reloadData()

但。 这不起作用,我不知道为什么表不能向上滚动。

唯一有效的方法:

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

但是现在表格上升时会出现另一个问题,可能会出现错误,因为segmentedControl已经更改,而另一个数组中的数据可能没有,我们还没有完成reloadData()

也许我无法理解明显的事情)祝贺即将到来的假期!

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 } } 

我找到了更好的方法来做到这一点。 它就像一个魅力。

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

你可以用它。

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

您可以根据需要设置动画

在调用reloadData后尝试滚动到顶部后,我收到以下错误

 [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (0) beyond bounds (0) for section (0).' 

这为我修好了:

  tableView.reloadData() if tableView.numberOfRows(inSection: 0) != 0 { tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) } 
Interesting Posts