5

我有一个表格视图,其中包含具有动态单元格高度的自定义单元格,具体取决于单元格内容。

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

这是代码:

[self.tableView reloadData];

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

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

4

2 回答 2

12

据我所知,

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

所有操作数据修改,UI修改都view需要在viewDidAppear. 甚至一些操作也可以在viewWillAppear.

因此,对于您的问题,UITableView必须在表格加载并显示在屏幕上(即viewDidAppear.

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

于 2012-10-23T14:46:46.050 回答
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(), ^{
    ...
}); 

在 [tableView reloadData] 给 tableView 足够的时间来更新行计数器并执行滚动到现有行之后。

Vishy 的方法之所以有效,是因为它提供了足够的时间,但仅适用于您需要在加载屏幕时恰好滚动一次的情况。此外,每次 viewDid/WillAppear 时都需要检查丑陋的标志。

于 2015-02-24T10:53:07.427 回答