打完电话后-[UICollectionView reloadData]
它需要一些时间来显示电池,所以立即选择一个项目后,调用reloadData
不起作用。 有没有办法来后直接选择项目reloadData
?
Answer 1:
沿线的这个答案我发现,调用layoutIfNeeded
后reloadData
似乎有效地“冲洗”重装之前,我做其他的事情到的CollectionView:
[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
...
在我发现这个解决方案的页面,一些评论者表示,它并没有为他们在iOS 9工作,但它一直对我很好所以你的里程可能会有所不同。
Answer 2:
我管细胞的选择中collectionView: cellForItemAtIndexPath:
我发现的问题是,如果电池不存在,只是要求selectItemAtIndexPath: animated: scrollPosition:
实际上不会选择该项目。
相反,你必须做的:
cell.selected = YES;
[m_collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
Answer 3:
不要使用reloadData
使用- (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion
,而不是。 完成块被用于细胞的插入/缺失等动画已经完成之后被执行。 你可以把呼叫reloadData在(void (^)(void))updates
块
Answer 4:
苹果说:
你不应该叫在项目被插入或删除动画块的中间这种方法。 插入和缺失自动使表的数据进行适当的更新。
事实上,你不应该在任何动画(包括中间调用此方法UICollectionView
在滚动)。
所以,你可以使用:
[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
或标记千万不要任何动画,然后调用reloadData
; 要么
[self.collectionView performBatchUpdates:^{
//insert, delete, reload, or move operations
} completion:nil];
希望这对您有所帮助。
Answer 5:
雨燕方式:
let selected = collectionView.indexPathsForSelectedItems()
collectionView.performBatchUpdates({ [weak self] in
self?.collectionView.reloadSections(NSIndexSet(index: 0))
}) { completed -> Void in
selected?.forEach { [weak self] indexPath in
self?.collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: [])
}
}
Answer 6:
请确保你调用reloadData
在主线程上。 这可能是在你的细胞更新延迟的原因。
Answer 7:
我处理它的willDisplayCell colelctionView委托。 这个想法:需要一个临时变量来指定初始滚动已经或没有(scrollIsRequired)中进行。 当最后一个可见单元格将显示,比我们可以滚动到所需的细胞,并设置这个变量,以避免再次滚动。
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{
//Perform any configuration
if (CGRectGetMaxX(collectionView.frame) <= CGRectGetMaxX(cell.frame)) {
// Last visible cell
if (self.scrollIsRequired) {
[self.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForItem:self.initiallySelectedRepresentativeVerse inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionLeft];
self.scrollIsRequired = NO;
}
}
}
它为我工作就像一个魅力。
Answer 8:
这是对我工作:
我保持所选索引路径的基准和在此改变reloadData功能:
override func reloadData() {
super.reloadData()
self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}
我尝试使用indexPathForSelectedItems这样做,但它创造的集合视图负载无限循环。
Answer 9:
创建一个具有选择的方法,并呼吁重新加载在例如经过使用performSelector调用它;
[self performSelector:@selector(selectIt) withObject:self afterDelay:0.1];