我有一个带有动态单元格高度的自定义单元格的tableview,具体取决于单元格内容。
我的问题如下,当我在viewDidLoad中以编程方式询问滚动到它工作的给定位置,除了最后一行。有时行出现但不完整,有时甚至不出现。在这两种情况下,我都必须手动滚动才能看到该行。
以下是代码:
[self.tableView reloadData];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:aRow inSection:aSection];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES ];
这是iOS的错误吗?任何解决方法?
答案 0 :(得分:11)
到目前为止,我开始知道,
屏幕上显示view
之前的所有操作都在viewDidLoad
所有UI对象中初始化,数据对象可以在此方法中分配和初始化。
所有操作数据修改,对view
所做的UI修改都需要在viewDidAppear
中完成。甚至可以在viewWillAppear
中完成一些操作。
因此,对于您的问题,必须在表格加载后进行UITableView
滚动。显示在屏幕上,即viewDidAppear
。
另请注意viewDidAppear
&每次向用户显示视图时都会调用viewWillAppear
,因此如果您只想为第一个实例滚动表,则可以在标题中指示一个标记该实例的标记。
答案 1 :(得分:4)
[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(), ^{
...
});