UITableView scrollToRowAtIndexPath

Posted

技术标签:

【中文标题】UITableView scrollToRowAtIndexPath【英文标题】: 【发布时间】:2009-09-26 00:35:40 【问题描述】:

我试图让我的表格视图记住它的最后一个位置,以便在应用再次运行后,它会滚动到那个位置。为此,在我的viewWillDisappear: 方法中,我获取第一个可见行号并将其保存到NSUserDefaults。然后在我的 viewDidAppear 中,我尝试通过将scrollToRowAtIndexPath 发送到表格视图来滚动到该行。但是我得到了NSRangeException

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[: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"];

【问题讨论】:

您能发布一些创建 scrollToRowAtIndexPath 和 NSIndexPath 的代码吗? 【参考方案1】:

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

[contentTableView reloadData];

【讨论】:

当数据尚未加载(使用获取的结果控制器)时,这对我不起作用。我的解决方案是先检查tableView.numberOfRowsInSection(0) > 0 或者如果在不同的线程上,试试这个。 [tblView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]【参考方案2】:

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

【讨论】:

完成后如何收到通知? 抱歉,我以为在 viewDidLoad 中调用了 scrollToRowAtIndexPath。我在 viewDidAppear 中有类似的调用,但我没有返回保存的行号,而是返回保存在 didSelectRowAtIndexPath 中的保存键值。在调用 scrollToRowAtIndexPath 之前,我在当前加载的数据源中找到了该键值所在的行。 甜蜜!这实际上帮助我的齿轮朝着正确的方向旋转。我在单独的答案中进行了详细说明。【参考方案3】:

我想详细说明 DyingCactus 的回答。我是一个相当新的 ios 开发人员,我的情况有点不同,但正如他所说

"可能是contentTableView还没有加载完毕 数据”

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

我的设置

UITableView 位于 ViewController“A”上 我的应用提供了一个新的 ViewController“B” 在 ViewController "B" 上单击一个按钮,然后将数据添加到 UITableView 的数据源中。 从 B 的按钮点击处理程序中,[tableView reloadData] 被调用 从 B 的按钮单击处理程序中,[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 调用在选择器完成之前没有明确设置为阻塞。

希望这对某人有所帮助。

【讨论】:

以上是关于UITableView scrollToRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

UITableView

水平 UITableView 中的垂直 UITableView

如何与重叠显示的 UITableView 交互另一个 UITableView

在 UITableView 中的 UINib 中重新加载 UITableView

iOS小技能:1. 什么是UITableView? 2. UITableView如何展示数据