Ios UItableview ScrollToRowatineXpath未正确显示最后一行

Ios UItableview ScrollToRowatineXpath未正确显示最后一行,ios,uitableview,scroll,Ios,Uitableview,Scroll,我有一个带有自定义单元格的表格视图,根据单元格内容具有动态单元格高度 我的问题是,当我在viewDidLoad中以编程方式要求滚动到指定位置时,它可以工作,最后一行除外。有时行显示但不完整,有时甚至不显示。在这两种情况下,我必须手动滚动以查看行 代码如下: [self.tableView reloadData]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:aRow inSection:aSection]; [self.table

我有一个带有自定义单元格的表格视图,根据单元格内容具有动态单元格高度

我的问题是,当我在viewDidLoad中以编程方式要求滚动到指定位置时,它可以工作,最后一行除外。有时行显示但不完整,有时甚至不显示。在这两种情况下,我必须手动滚动以查看行

代码如下:

[self.tableView reloadData];

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

这是iOS的一个bug吗?有什么解决办法吗?

据我所知

在屏幕上显示
视图
之前使用的所有操作都在
viewDidLoad
中初始化。所有UI对象、数据对象都可以通过此方法进行分配和初始化

视图所做的所有操作数据修改、UI修改都需要在
视图中完成。或者甚至可以在
视图中执行某些操作,这些操作将出现

因此,对于您的问题,
UITableView
滚动必须在表格加载到屏幕上并显示在屏幕上后进行,即在
viewdide中出现

还要注意的是,每次向用户显示视图时,都会调用
viewdideappear
&
viewWillAppear
,因此,如果只想滚动第一个实例的表格,则可以在标题中使用一个标志指示该实例

[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 ScrollToRowatineXpath…]则没有效果,因为当时没有这样的行(同样,如果您第一次添加行或设置tableView的数据,可能是正确的)

dispatch_async(dispatch_get_main_queue(), ^{
    ...
}); 
[tableView reloadData]给tableView足够的时间更新行计数器并执行滚动到现有行之后


只因为它提供了足够的时间,但仅当您需要在屏幕加载时准确滚动一次时才适用。此外,每次viewDid/Will出现时,它都需要丑陋的标志来检查。

您是否在
ViewDidAspect
中尝试过此代码?我已将其添加为答案,检查两种方法的差异。.我们可以删除当前代码Cleaness的注释另请参见如果您需要在不离开屏幕的情况下更新内容,您会怎么做?在这种情况下,我们不能依赖viewDidLoad。@FyodorVolcyOK在这种情况下,表已经加载,因此可以很容易地从任何位置滚动。