如何让UITableview重新加载到页面顶部?

App*_*now 31 iphone cocoa-touch tableview

当我从下面调用以下内容时,当我重新加载表数据时,我试图让UITableview转到页面顶部

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

// A bunch of code …

[TableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

同样,我还希望能够在重新加载表数据时转到特定的部分.

我尝试放置以下内容,这似乎只适用于重新加载之前和之后的行,但没有任何反应:

[TableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionTop  animated:YES];
Run Code Online (Sandbox Code Playgroud)

Eri*_*k B 64

这是你可以做到的另一种方式:

Objective-C的

[tableView setContentOffset:CGPointZero animated:YES];
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

tableView.setContentOffset(.zero, animated: true)
Run Code Online (Sandbox Code Playgroud)

可能是最简单,最直接的方式.

  • 有时这应该在0.1秒之后延迟执行.例如`DispatchQueue.main.asyncAfter(截止日期:.now()+ 0.1,执行:{tableView.setContentOffset(.zero,animated:false)}) (5认同)

pha*_*ann 30

在阅读了这里和其他地方的所有答案之后,我终于找到了一个可靠的解决方案,并且在加载数据后没有显示滚动.我的回答是基于这篇文章和我的观察,如果你使用内容插入,你需要一个负偏移:

func reloadAndScrollToTop() {
    tableView.reloadData()
    tableView.layoutIfNeeded()
    tableView.contentOffset = CGPoint(x: 0, y: -tableView.contentInset.top)
}
Run Code Online (Sandbox Code Playgroud)

  • 应该将其标记为正确答案,因为它尊重之前设置的所有插图 (3认同)
  • 如果您打算使用 contentOffset 您应该在 reloadData 之前运行它,因为 reloadData 异步运行,因此 reloadData 可能不会在 contentOffset 完成之前完成,因此您的偏移量将不准确 (2认同)

sc1*_*c13 20

这对我有用.

tableView.scrollToRow(at: IndexPath.init(row: 0, section: 0), at: .top, animated: true)
Run Code Online (Sandbox Code Playgroud)

  • 最好的方法是您的项目数量之前已更改(使用reloadData) (2认同)

rag*_*fin 19

要滚动到特定部分,您需要指定它的索引路径:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:0 inSection:0];
[TableView scrollToRowAtIndexPath:topPath
                 atScrollPosition:UITableViewScrollPositionTop
                         animated:YES];
Run Code Online (Sandbox Code Playgroud)

如果您不确定tableView中的行数.使用以下内容:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[TableView scrollToRowAtIndexPath:topPath
                 atScrollPosition:UITableViewScrollPositionTop
                         animated:YES];
Run Code Online (Sandbox Code Playgroud)

  • 您应该确保表中存在该行,否则它将引发异常. (4认同)

Bob*_*aaf 13

没有动画

我在iOS11上,使用带有粘性标题的普通tableview样式,并且在某种程度上我只有这样才能正常工作才能在没有任何奇怪的闪烁/动画行为的重新加载后将tableview真正放在顶部才能按此顺序使用这些方法其中所有这些都是必要的:

[self.tableView setContentOffset:CGPointZero animated:NO];
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
[self.tableView setContentOffset:CGPointZero animated:NO];
Run Code Online (Sandbox Code Playgroud)

我很认真,所有这些都是必要的,尽管看起来第一行根本不相关.哦是的,也很重要,不要用这个:

self.tableView.contentOffset = CGPointZero;
Run Code Online (Sandbox Code Playgroud)

您会认为它与"setContentOffset animated:FALSE"相同,但显然它不是!Apple对此方法的处理方式不同,在我的情况下,只有在使用带动画的完整方法时才有效:FALSE.

动画

我也想用一个很好的滚动动画来尝试这个.内容偏移方法似乎仍然会导致一些奇怪的动画行为.在一些试验和错误之后,我得到这个有一个很好的动画的唯一方法是这些方法按照这个确切的顺序:

[self.tableView reloadData];
[self.tableView layoutIfNeeded];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:TRUE];
Run Code Online (Sandbox Code Playgroud)

警告,确保在运行最后一行代码之前至少有一行以避免崩溃:)

我希望有一天能帮助别人!