UItableview scrollToRowAtIndexPath未正确显示最后一行

HpT*_*erm 4 scroll uitableview ios

我有一个自定义单元格的tableview,其动态单元格高度取决于单元格内容.

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

这是代码:

[self.tableView reloadData];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:aRow inSection:aSection];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES ];
Run Code Online (Sandbox Code Playgroud)

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

vis*_*shy 11

到目前为止,我才知道,

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

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

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

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


Fyo*_*yok 5

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

我不知道确切的原因,但我想这种方法有效,因为当我们添加(???)行并调用 [tableView reloadData] tableView 没有时间更新一些内部计数器(如行计数器)并调用 [tableView rollToRowAtIndexPath 。 ..] 没有任何效果,因为当时没有这样的行(同样,如果您第一次添加行或设置 tableView 的数据,则可能是正确的)。呼唤

dispatch_async(dispatch_get_main_queue(), ^{
    ...
}); 
Run Code Online (Sandbox Code Playgroud)

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

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