背景:列表有时需要跳转到指定的位置。
问题: collectionView中reloadData与scrollToItemAtIndexPath同时使用时,会导致跳转失败。
分析: reloadData是异步调用的,也就是说collectionView还没刷新完成,scrollToItemAtIndexPath跳转会有问题的。
解决方案:
- 在刷新之后强制绘制collectionView,在跳转位置。
[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:_checkedRow inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
2.同样异步向主队列中提交一个任务。
[self.collectionView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
_checkedRow = dataArray.count-1;
[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:_checkedRow inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
});
如果是tableView,可以用beginUpdates和endUpdates包裹。
[self.tableView beginUpdates];
[self.tableView reloadData];
[self.tableView endUpdates];
总结:
推荐使用第二种办法,即使开启跳转的动画,也能正常跳转。
有任何问题欢迎留言交流。
网友评论