记住UITableView上的滚动位置

时间:2013-09-17 07:15:57

标签: ios uitableview uiviewcontroller reloaddata viewdidappear

我在xcode中的iOS应用程序有点问题。我有一个UITableView加载几百个单元格。当我向下滚动到特定单元格并向下钻取到详细视图控制器并再次返回时,主视图表一直返回到顶部。我已经看过以下两个相似的问题。

How can I get the UITableView scroll position so I can save it?

Setting scroll position in UITableView

我仍然无法让这些工作。我不是最有经验的编码员,所以我真的很挣扎。

我知道像viewWillDisappear和viewDidAppear这样的东西需要改变,但我真的不能比这更进一步。

在这张桌子上,我有一个reloadData功能,因此可以从服务器和工作搜索栏中下载最新数据。

无论如何,伸出援助之手会很棒。谢谢,

8 个答案:

答案 0 :(得分:66)

请在此处首先保存tableView的滚动位置,即contentOffset的{​​{1}},然后在您返回tableView时重复使用。

1)保存的时间和地点:

何时:此时,当您向下钻取tableView时,保存detailViewController contentOffset

tableView

2)如何将tableView设置回相同的滚动位置:

float verticalContentOffset  = tableView.contentOffset.y;

希望这会对您有所帮助。

答案 1 :(得分:12)

排序!

来自Desdenova的一点灵感,在工作中我很好地思考它,并意识到它可能是什么。记住我有一个搜索栏,几个月前我已经实现了以下代码来隐藏它:

[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];

天真地我把它放在viewDidAppear而不是viewDidLoad。显然,这确实隐藏了搜索栏,但是当它在错误的void命令中时,每次masterDetailView返回到堆栈顶部时都会执行它。所以,在将上面的代码移到viewDidLoad之后,它现在仍然隐藏它,但只有一次。

我只是像其他初学者一样拼出来,像我一样,可能会遇到同样的问题而且可能只是为了拯救他们的理智!

感谢大家帮助我的所有想法。

给大家+1!

答案 2 :(得分:1)

如果有人想知道,我尝试了Prashant N的解决方案并且它有效。但是reloadData现在不再重置滚动位置,所以除了reloadData之外我不需要做任何事情。

答案 3 :(得分:1)

我对此问题的解决方案包括将表格滚动到最后一项的indexrow。

private func scrollToItem(item:Int, section:Int bottom:Bool = true, animated:Bool = false) {
    let indexPath = NSIndexPath(forRow: item:Int-1, inSection: section)
    var position = UITableViewScrollPosition.Bottom
    if (!bottom) { position = UITableViewScrollPosition.Top }
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: position, animated: animated)
}

答案 4 :(得分:1)

出于某种原因,这对我来说是中途工作(有时候这个职位只是近似的)。我终于使用了以下先验不太干净的解决方案

NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;

效果更好。

答案 5 :(得分:1)

我决定收藏:

CGFloat oldCollectionViewHeight = self.messageCollectionView.contentSize.height;

[self.messageCollectionView reloadData];
[self.messageCollectionView layoutIfNeeded];

CGFloat newCollectionViewHeight = self.messageCollectionView.contentSize.height;

if (oldCollectionViewHeight) {
    self.messageCollectionView.contentOffset = CGPointMake(0, newCollectionViewHeight - oldCollectionViewHeight);
}

对于表格,原则是相同的。

答案 6 :(得分:0)

正如其他评论中所提到的,在UINavigationController中向后滚动导航到顶部不是默认行为。

另一个原因可能是您正在将表格顶部附近的单元格设置为viewWillAppear中的第一响应者,例如表格顶部附近的搜索框或编辑字段。 UITableViewController会自动将第一个响应者滚动到视图中,这很不错。只要这是你正在尝试做的事情。 :)注意不要在viewWillAppear中设置第一响应者,除非这是你想要的。干杯,亚利桑那州

答案 7 :(得分:0)

您无需执行任何操作,而在同一视图控制器中,您的位置将保持不变。恐怕您的视图控制器中的某处被称为reloadData。搜索一些调用scrollToRowAtIndexPath的方法。