2011-04-04 97 views
23

我试图让一个UITableView去页面的顶部,当我重新加载表数据时,我打电话从如何让UITableview在重新加载时进入页面顶部?

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

// A bunch of code … 

[TableView reloadData]; 
} 

本着同样的精神下,我也想能去当我重新加载表格数据时到特定的部分。

我试图把下面这之前和重装后只到行似乎适用,但没有任何反应:

[TableView scrollToRowAtIndexPath:0 atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

回答

51

这里的另一种方式,你可以这样做:

Objective-C的

[tableView setContentOffset:CGPointZero animated:YES]; 

斯威夫特3

tableView.setContentOffset(.zero, animated: true) 

也许最简单,最直接的方式去做吧。

+0

谢谢。这让我到页面的顶部,这是我的迫切需要。 – AppsToKnow 2011-04-04 20:47:19

+1

有时这应该在延迟0.1秒后执行。例如'DispatchQueue.main.asyncAfter(截止日期:.now()+ 0.1,执行:{table_view.setContentOffset(。零,动画:假) }) – 2017-11-13 15:18:11

4

的UITableView是的UIScrollView的子类,所以你也可以使用:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 
+0

谢谢。我试过这个,它工作得很好,但我用下面的例子。 – AppsToKnow 2011-04-04 20:50:59

14

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

​​

如果您不确定tableView中的行数。使用以下命令:

NSIndexPath *topPath = [NSIndexPath indexPathForRow:NSNotFound inSection:0]; 
[TableView scrollToRowAtIndexPath:topPath 
       atScrollPosition:UITableViewScrollPositionTop 
         animated:YES]; 
+4

您应该确保表中存在该行,否则会引发异常。 – 2011-04-04 20:07:14

+0

感谢此代码。我已经发布了我的应用程序,但我想在第一次更新中使用它。 – AppsToKnow 2011-04-13 12:47:36

+0

@CameronSpickert查看已更新的条件。 – 2017-10-25 10:10:52

0

如果您在重新加载前滚动并且行数减少,您可能会产生一些奇怪的动画行为。为了确保重载后的滚动情况,使用这样的方法:

- (void)reloadTableViewAndScrollToTop:(BOOL)scrollToTop { 
    [self.tableView reloadData]; 
    if (scrollToTop) { 
     [self.tableView setContentOffset:CGPointZero animated:YES]; 
    } 
} 
9

阅读所有的答案在这里和其他地方后,我终于找到了可靠地工作和之后的数据加载不显示滚动的解决方案。我的回答是在此基础上post和我的观察,你,如果你使用的是内容的插图需要负偏移:

func reloadAndScrollToTop() { 
    tableView.reloadData() 
    tableView.layoutIfNeeded() 
    tableView.contentOffset = CGPoint(x: 0, y: -tableView.contentInset.top) 
} 
+1

这应该被标记为正确的答案,因为它承认之前设置的任何插入 – 2017-05-14 04:54:30

+0

这个组合和改变'tableView.estimatedRowHeight'到我的顶部分隔符的高度做的工作我。 – Deco 2017-10-03 13:05:15

+0

'tableView.layoutIfNeeded()'帮了我1-2小时的挣扎! – SoftDesigner 2017-11-06 12:19:38

1

在SWIFT 3.1

DispatchQueue.main.async(execute: { 

     self.TableView.reloadData() 
     self.TableView.contentOffset = .zero 

    }) 
1

这是为我工作。

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

最好的方法,如果你的项目数量之前已经改变(与reloadData) – RPallas 2018-01-17 08:53:46