我正在尝试让我的表格视图记住它的最后位置,以便在应用程序再次运行后,它将滚动到该位置。为此,在我的viewWillDisappear:
方法中,我获得了第一个可见的行号并将其保存到NSUserDefaults
。然后在我的viewDidAppear中,我尝试通过将scrollToRowAtIndexPath
发送到表视图来滚动到该行。但是我得到了NSRangeException
:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]: section (0) beyond bounds (0).
任何帮助表示赞赏。这是代码:
- (void)viewDidAppear:(BOOL)animated
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ([userDefaults valueForKey:@"content_row"] != nil)
{
int rowToHighlight = [[userDefaults valueForKey:@"content_row"] intValue];
NSIndexPath * ndxPath= [NSIndexPath indexPathForRow:rowToHighlight inSection:0];
[contentTableView scrollToRowAtIndexPath:ndxPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}
-(void) viewWillDisappear:(BOOL)animated
{
NSIndexPath *selectedRowPath = [[contentTableView indexPathsForVisibleRows] objectAtIndex:0];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:selectedRowPath.row forKey:@"content_row"];
}
答案 0 :(得分:53)
在调用scrollToRowAtIndexPath之前重新加载TableView数据。
[contentTableView reloadData];
答案 1 :(得分:8)
contentTableView可能还没有完成加载数据。
答案 2 :(得分:0)
我想详细说明DyingCactus'回答。我是一个非常新的iOS开发人员,我的情况有点不同,但正如他所说的那样
"有可能contentTableView尚未完成加载 数据"
虽然答案很简短,但它让我的车轮转动,这正是我发生的事情。
我的设置
[tableView reloadData]
被称为[tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop];
被称为<强>解决方案强>
我必须解决的第一个问题是在主线程上调用reloadData
,就像这样
[tblView performSelectorOnMainThread:@selector(reloadData)withObject:nil waitUntilDone:false];
最后一个问题是将waitUntilDone
更改为 true (DUH!)
是的,很明显对我来说,contentTableView没有完成加载数据,因为在主线程上运行的reloadData调用没有显式设置为阻塞,直到选择器完成。
希望这有助于某人。