UITableView scrollToRowAtIndexPath

时间:2009-09-26 00:35:40

标签: 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"];
}

3 个答案:

答案 0 :(得分:53)

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

[contentTableView reloadData];

答案 1 :(得分:8)

contentTableView可能还没有完成加载数据。

答案 2 :(得分:0)

我想详细说明DyingCactus'回答。我是一个非常新的iOS开发人员,我的情况有点不同,但正如他所说的那样

  

"有可能contentTableView尚未完成加载   数据"

虽然答案很简短,但它让我的车轮转动,这正是我发生的事情。

我的设置

  • UITableView位于ViewController" A"
  • 我的应用程序提供了一个新的ViewController" B"
  • 在ViewController" B"单击一个按钮,然后将数据添加到UITableView的数据源。
  • 在B&#39的按钮点击处理程序中,[tableView reloadData]被称为
  • 在B&#39的按钮点击处理程序中,[tableView selectRowAtIndexPath:idxPath animated:false scrollPosition:UITableViewScrollPositionTop];被称为
  • ViewController" B"被解雇," A"再次出现(显示更新的UITableView)

<强>解决方案

  • 我必须解决的第一个问题是在主线程上调用reloadData,就像这样

    [tblView performSelectorOnMainThread:@selector(reloadData)withObject:nil waitUntilDone:false];

  • 最后一个问题是将waitUntilDone更改为 true (DUH!)

是的,很明显对我来说,contentTableView没有完成加载数据,因为在主线程上运行的reloadData调用没有显式设置为阻塞,直到选择器完成。

希望这有助于某人。