UITableView scrollToRowAtIndexPath

Ali*_*fai 20 iphone uitableview

我正在尝试让我的表格视图记住它的最后位置,以便在应用程序再次运行后,它将滚动到该位置.要做到这一点,在我的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"];
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*ust 53

在调用scrollToRowAtIndexPath之前重新加载TableView数据.

[contentTableView reloadData];
Run Code Online (Sandbox Code Playgroud)

  • 当数据尚未加载时(使用获取的结果控制器),这对我不起作用.我的解决方案是首先检查`tableView.numberOfRowsInSection(0)> 0`. (4认同)

小智 8

contentTableView可能尚未完成加载数据.

  • 对不起,我以为在viewDidLoad中调用了scrollToRowAtIndexPath.我在viewDidAppear中有类似的调用,但我没有返回到保存的行号,而是返回保存在didSelectRowAtIndexPath中的保存键值.在调用scrollToRowAtIndexPath之前,我在当前加载的数据源中找到键值的行. (2认同)