UItableview scrollToRowAtIndexPath未正确显示最后一行

时间:2012-10-23 10:16:21

标签: ios uitableview scroll

我有一个带有动态单元格高度的自定义单元格的tableview,具体取决于单元格内容。

我的问题如下,当我在viewDidLoad中以编程方式询问滚动到它工作的给定位置,除了最后一行。有时行出现但不完整,有时甚至不出现。在这两种情况下,我都必须手动滚动才能看到该行。

以下是代码:

[self.tableView reloadData];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:aRow inSection:aSection];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES ];

这是iOS的错误吗?任何解决方法?

2 个答案:

答案 0 :(得分:11)

到目前为止,我开始知道,

屏幕上显示view之前的所有操作都在viewDidLoad所有UI对象中初始化,数据对象可以在此方法中分配和初始化。

所有操作数据修改,对view所做的UI修改都需要在viewDidAppear中完成。甚至可以在viewWillAppear中完成一些操作。

因此,对于您的问题,必须在表格加载后进行UITableView滚动。显示在屏幕上,即viewDidAppear

另请注意viewDidAppear&每次向用户显示视图时都会调用viewWillAppear,因此如果您只想为第一个实例滚动表,则可以在标题中指示一个标记该实例的标记。

答案 1 :(得分:4)

[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
        NSIndexPath *rowIndexPath = [NSIndexPath indexPathForRow:3 inSection:0];
        [self.tableView scrollToRowAtIndexPath:rowIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
});

我不确切知道为什么,但我猜这种方法有效,因为当我们添加(???)行并调用[tableView reloadData]时,tableView没有时间更新一些内部计数器(如行计数器)并调用[ tableView scrollToRowAtIndexPath ...]没有效果,因为那时没有这样的行(同样,如果你添加行或第一次设置tableView的数据,可能是正确的)。致电

dispatch_async(dispatch_get_main_queue(), ^{
    ...
}); 
reloadData]之后

给tableView足够的时间更新行计数器并执行滚动到现有行。

Vishy's approach只是因为它提供了足够的时间,但只有在需要在加载屏幕时完全滚动一次时才适用。此外,每次viewDid / WillAppear都需要检查丑陋的旗帜。