我有一个带有表视图的段控件。当用户单击分段控件时,表视图会更改数据源。我希望桌子滚动到用户看到的最后位置。
例如:用户位于第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];
}
有没有人有同样的问题?非常感谢提前!
答案 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;
}
谢谢大家的帮助!