当段值更改时,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当段错误

离子段值检查所有

段值相关

截取js数组中某段值(slice)

oracle语句中,某个段值想四舍五入,并且保留小数点的后2位,是否有函数可以直接写出来;

oracle语句中,某个段值想四舍五入,并且保留小数点的后2位,是否有函数可以直接写出来;