UITableView的scrollToRowAtIndexPath无法正确显示最后一行(UItab

2019-07-01 22:48发布

我有与根据单元格内容的动态单元格高度定制细胞的tableview。

我的问题是下面的,当我问,编程,在viewDidLoad中,滚动到它的工作原理,除了最后一排一个给定的位置。 有时行显示,但不完全,有时它甚至不会出现。 在这两种情况下,我必须手动滚动查看该行。

下面是代码:

[self.tableView reloadData];

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

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

Answer 1:

由于到目前为止,我才知道,

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

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

因此,对于您的问题, UITableView滚动必须在正装表后与屏幕上即显示,在完成viewDidAppear

还要注意的是viewDidAppearviewWillAppear将视图显示给用户,每次被调用,所以如果你要滚动的表只对第一个实例,你可以在你的头表示实例有一个标志。



Answer 2:

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



文章来源: UItableview scrollToRowAtIndexPath not displaying last row correctly