之前公司项目首页数据在加载完成之后会有一个新手引导层,后来项目要添加预加载,问题就来了,进入首页后tableView滚动位置不对,到不了最底部。
// 加载数据
[self.myTableView reloadData];
// 滚动
[self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
如果是需要[tableView reloadData]完成后获取tableView的cell、高度,直接在reloadData后执行会有问题,因为reloadData不会等tableView更新结束后才返回,而是立即返回,然后计算表高度,执行滚动之类的代码。
很明显这里的原因是因为数据比较大,一个run loop周期没执行完,tableView滚动时,表的高度不对。
解决方法:
1、强制刷新
[self.myTableView reloadData];
[self.myTableView layoutIfNeeded];
[self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
layoutIfNeeded会强制重绘并等待完成。
2、线程等待
[self.myTableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新
[weakSelf.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([weakSelf.myTableView numberOfRowsInSection:2]-1) inSection:2] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
});
[tableView reloadData]在主队列执行,而dispatch_get_main_queue()会等待主队列空闲后才执行。
参考链接
网友评论