我有与根据单元格内容的动态单元格高度定制细胞的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
。
还要注意的是viewDidAppear
和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 scrollToRowAtIndexPath。 ..]没有任何效果,因为没有这样的行当时(再次,可能是正确的情况下,您添加行或设置的tableView的数据首次)。 调用
dispatch_async(dispatch_get_main_queue(), ^{
...
});
后[的tableView reloadData]给出的tableView足够的时间更新行计数器并执行滚动到现有行。
Vishy的方式工作,只是因为它提供了足够的时间,但只适用,如果你需要加载画面时恰好滚动一次。 此外,它需要难看的标志来检查,每次viewDid / WillAppear。