UItableview scrollToRowAtIndexPath不能正确显示最后一行

我有一个dynamic单元格高度取决于单元格内容自定义单元格的tableview。

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

这里是代码:

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

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

到目前为止,我才知道,

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

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

所以对于你的问题, UITableView滚动必须在表格加载后显示在屏幕上,即在viewDidAppear

另外请注意, viewDidAppearviewWillAppear将在每次向用户显示视图时被调用,所以如果只想为第一个实例滚动表,则可以在标题中指定一个标志来指示实例。

 [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。