[英]Remembering scroll position on UITableView
我在xcode中的iOS应用存在问题。 我有一个UITableView可以加载数百个单元格。 当我向下滚动到一个特定的单元格并向下钻取到详细的viewcontrollers并再次返回时,主视图表一直返回到顶部。 我看了以下两个相似的问题。
我仍然无法使它们正常工作。 我不是最有经验的编码员,所以我为此感到非常挣扎。
我知道需要更改诸如viewWillDisappear和viewDidAppear之类的东西,但是我实在不能做得更多。
在此表上,我具有reloadData功能,因此可以从服务器中提取最新数据,还可以在工作中搜索栏。
无论如何,伸出援助之手会很棒。 谢谢,
路加
看到这里,你必须先保存的滚动位置tableView
即contentOffset
的tableView
然后再用它,当你回来tableView
。
1)何时何地保存它:
什么时候 :在这一点上,当您向下钻取到detailViewController
保存tableView
的contentOffset
如何 : float verticalContentOffset = tableView.contentOffset.y;
2)如何将tableView设置回相同的滚动位置:
[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];
希望这会帮助你。
排序!
在工作中,我从Desdenova身上获得了一些启发,对此我进行了认真的思考,并意识到了它的可能。 记住我有一个搜索栏,几个月前我实现了以下代码以将其隐藏:
[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];
出于天真,我将其放在viewDidAppear
而不是viewDidLoad
。 显然,这确实隐藏了搜索栏,但是由于它位于错误的void命令中,因此每次masterDetailView返回堆栈顶部时,它都会进行搜索。 因此,将上面的代码移动到viewDidLoad之后,它现在仍然将其隐藏,但仅一次。
我只是为其他初学者(像我自己)这样拼写出来,他们可能会遇到相同的问题并且可能会保存理智!
谢谢大家为我提供帮助的想法。
对所有人+1!
如果有人想知道,我尝试了Prashant N的解决方案,它奏效了。 但是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)
}
由于某种原因,这对我来说是半途而废的(有时职位只是大概的)。 我终于使用了以下优先级较低的解决方案
NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;
效果更好。
如其他注释中所述,滚动到UINavigationController中的Back导航顶部不是默认行为。
另一个原因可能是您正在将表格顶部附近的单元格设置为viewWillAppear中的第一响应者,例如,表格顶部附近的搜索框或编辑字段。 UITableViewController会自动将第一个响应者滚动到视图中,这很好。 只要这就是您要尝试的方法。 :)注意不要在viewWillAppear中设置第一响应者,除非您要这样做。 亚利桑那州,干杯
我的收藏决定:
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);
}
对于表,原理是相同的。
您无需执行任何操作,当您在同一视图控制器中时,您的位置将相同。 恐怕您的视图控制器中的某处被称为reloadData。 搜索一些调用scrollToRowAtIndexPath的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.