记住UITableView的滚动位置

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

我怎样才能获得UITableView的滚动位置,所以我可以保存它?

在UITableView中设置滚动位置

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

我知道像viewWillDisappear和viewDidAppear需要改变的东西,但我真的不能远远超过这一点。

在这张桌子上,我有一个reloadDatafunction,所以可以从服务器上下载最新的数据,也可以在工作的search栏中查看。

无论如何,一个援助之手将是伟大的。 谢谢,

卢克

看到这里你必须先保存tableView的滚动位置,即tableView contentOffset ,然后在你回到tableView时候再使用它。

1)何时何地保存:

何时 :在这一点上,当您深入到detailViewController保存tableViewcontentOffset

如何float verticalContentOffset = tableView.contentOffset.y;

2)如何将tableView设置回同一个滚动位置:

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

希望这会帮助你。

sorting!

从Desdenova那里得到一些启发,在工作的同时,我好好思考一下,意识到可能是什么。 记住我有一个search栏,几个月前我已经实现了下面的代码来隐藏它:

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

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

我只是像其他初学者一样拼出来,像我自己,他们可能遇到同样的问题,可能只是保存他们的理智!

感谢你们所有的帮助我的想法。

+1给大家!

如果有人想知道,我尝试了Prashant N的解决scheme,它的工作。 但是reloadData现在不再重新设置滚动位置,所以除了reloadData以外我不需要做任何事情。

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

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

出于某种原因,这对我来说是半途而废的(有时候这个位置只能是近似的)。 我终于使用了以下先验较不干净的解决scheme

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

哪个效果更好。

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

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

我的collections决定:

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

对于表格,原理是一样的。