繁体   English   中英

记住UITableView上的滚动位置

[英]Remembering scroll position on UITableView

我在xcode中的iOS应用存在问题。 我有一个UITableView可以加载数百个单元格。 当我向下滚动到一个特定的单元格并向下钻取到详细的viewcontrollers并再次返回时,主视图表一直返回到顶部。 我看了以下两个相似的问题。

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

在UITableView中设置滚动位置

我仍然无法使它们正常工作。 我不是最有经验的编码员,所以我为此感到非常挣扎。

我知道需要更改诸如viewWillDisappear和viewDidAppear之类的东西,但是我实在不能做得更多。

在此表上,我具有reloadData功能,因此可以从服务器中提取最新数据,还可以在工作中搜索栏。

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

路加

看到这里,你必须先保存的滚动位置tableViewcontentOffsettableView然后再用它,当你回来tableView

1)何时何地保存它:

什么时候 :在这一点上,当您向下钻取到detailViewController保存tableViewcontentOffset

如何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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM