34

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

如何获取 UITableView 滚动位置以便保存?

在 UITableView 中设置滚动位置

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

我知道需要更改 viewWillDisappear 和 viewDidAppear 之类的东西,但我真的不能再进一步了。

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

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

卢克

4

8 回答 8

69

看到这里你必须先保存tableViewie contentOffsetof的滚动位置,tableView然后当你回到tableView.

1)您将在何时何地保存它:

时间:此时,当您向下钻取以detailViewController保存contentOffsettableView

如何float verticalContentOffset = tableView.contentOffset.y;

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

[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];

希望这会帮助你。

于 2013-09-17T08:21:37.120 回答
13

排序!

在 Desdenova 的启发下,我在工作中好好思考并意识到它可能是什么。记得我有一个搜索栏,几个月前我实现了以下代码来隐藏它:

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

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

我只是为像我这样的其他初学者这样拼写出来,他们可能会遇到同样的问题,并且可能会挽救他们的理智!

感谢大家的想法帮助了我。

给大家+1!

于 2013-09-17T16:56:35.430 回答
1

如果有人想知道,我尝试了 Prashant N 的解决方案,它奏效了。但是reloadData现在实际上不再重置滚动位置,所以除了reloadData.

于 2016-04-11T07:05:57.200 回答
1

我对这个问题的解决方案是将表格滚动到最后一项的索引行。

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)
}
于 2016-09-09T10:37:18.327 回答
1

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

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

哪个效果更好。

于 2017-01-25T07:02:31.737 回答
0

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

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

于 2017-05-04T21:44:33.437 回答
0

我的收藏决定:

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

对于表,原理是一样的。

于 2017-12-27T15:14:13.690 回答
0

你不需要做任何事情,当你在同一个视图控制器中时,你的位置是一样的。恐怕您的视图控制器中的某个地方被称为 reloadData。搜索一些调用 scrollToRowAtIndexPath 的方法。

于 2018-10-10T15:05:58.903 回答