当段值更改时,scrollToRowAtIndexPath不会滚动到正确的位置

时间:2014-06-25 15:39:16

标签: ios xcode ios7

我有一个带有表视图的段控件。当用户单击分段控件时,表视图会更改数据源。我希望桌子滚动到用户看到的最后位置。

例如:用户位于第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]; 

}

有没有人有同样的问题?非常感谢提前!

3 个答案:

答案 0 :(得分:0)

lastSavedRow将位于当前tableview的顶部。我认为处理数据源可能有问题。也许在更改数据源之后,用户看到的最后一个位置不是您想出的索引!  如果您提供更多信息或示例,我们可以帮助您找出错误。

答案 1 :(得分:0)

我会做以下事情。

1.在调用indexPathsForVisibleRows

之前调用visibleCells
[self.tableView visibleCells];

2.在识别firstVisibleIndexPath

之前,需要对数组进行排序

3.reloadData不是同步的,因此在尝试滚动到索引之前可能没有完成表的加载。因此,请尝试查看是否可以在其中一个委托函数中进行滚动而不是在此处。请参阅this

答案 2 :(得分:0)

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

谢谢大家的帮助!