当段值更改时,scrollToRowAtIndexPath 不会滚动到正确的位置
Posted
技术标签:
【中文标题】当段值更改时,scrollToRowAtIndexPath 不会滚动到正确的位置【英文标题】:scrollToRowAtIndexPath doesn't scroll to correct position when segment value changed 【发布时间】:2014-06-25 15:39:15 【问题描述】:我有一个带有表格视图的段控件。当用户单击段控件时,表格视图会更改数据源。我希望表格滚动到用户看到的最后一个位置。
例如:用户在第 1 段,正在查看第 3 行的表格视图。
第 1 段 |第 2 段
第 3 行 第 4 行 第 5 行
然后用户点击了分段 2,然后点击返回到分段 1。我希望表格视图滚动到第 3 行。
代码如下。在 viewDidAppear 中,我有相同的代码来获取 lastSavedRow 并调用 scrollToRowAtIndexPath。当应用程序被加载时,滚动工作。但是,在 segmentValueChanged 操作中,它不会滚动到正确的位置。在调试器中,我确定 lastSavedRow 的编号正确。
- (IBAction) segmentVauleChanged : (id)sender
// remember row number before segment value changes
NSArray *indexPaths = [self.tableView indexPathsForVisibleRows];
NSArray * sortedIndexPaths = [indexPaths sortedArrayUsingSelector:@selector(compare:)];
NSIndexPath *firstVisibleIndexPath = [sortedIndexPaths objectAtIndex:0];
// function to write row number and seg index to user default
[self saveScrollPositionInSegment: self.currentSegmentSelectedIndex row:firstVisibleIndexPath.row];
self.currentSegmentSelectedIndex = segmentController.selectedSegmentIndex;
[self.tableView reloadData];
// scroll to last saved position
int lastSavedRow = [self getScrollPositionInSegment:segmentController.selectedSegmentIndex];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:lastSavedRow inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
有人有同样的问题吗?非常感谢!
【问题讨论】:
为什么要对 indexPaths 数组进行排序?两个段是否使用相同的 tableview 数据源? 你是对的。无需排序。 感谢您的提问!不需要排序:-) 【参考方案1】:lastSavedRow 将位于当前 tableview 的顶部。我认为处理数据源可能有问题。也许在更改数据源之后,用户看到的最后一个位置不是您计算出的索引! 如果您提供更多信息或您的示例,我们可以帮助您找出错误。
【讨论】:
我添加了一些细节。数据源正确显示,并且由于滚动是在 tableView reloadData 之后,我不确定它是如何关联的。我检查了调试,lastSavedRow 是我期望的数字。但无论数字是多少,屏幕总是滚动到顶部。如果您需要更多详细信息,请告诉我。感谢您的帮助! 我觉得@hackerinheels 是对的,按照他的建议去做,如果不行,也许你可以给我们分享一个演示。【参考方案2】:我会做以下事情。
1 .在调用 indexPathsForVisibleRows 之前调用 visibleCells
[self.tableView visibleCells];
2.在识别firstVisibleIndexPath之前看看需要对数组进行排序
3.reloadData 不是同步的,因此在您尝试滚动到索引之前,表可能未完成加载。因此,请尝试查看是否可以在其中一个委托函数中而不是在此处进行滚动。见this。
【讨论】:
你是对的。事件的顺序不是我想的那样。感谢您的帮助!【参考方案3】:hackerinheels 的 (3) 是正确的。调用滚动表时 reloadData 尚未完成。所以我添加了代码:
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
if (section == ([self.tableView numberOfSections] - 1))
//NSLog(@"finish loading");
// put the scrolling table call here: [self scrollTableView ];
return nil;
感谢大家的帮助!
【讨论】:
以上是关于当段值更改时,scrollToRowAtIndexPath 不会滚动到正确的位置的主要内容,如果未能解决你的问题,请参考以下文章
与RCPP在Ubuntu Xenial扔的std :: runtime_error当段错误