Ios uicollectionview是否在重新加载数据后立即选择项目?
调用Ios uicollectionview是否在重新加载数据后立即选择项目?,ios,uicollectionview,Ios,Uicollectionview,调用-[UICollectionView reloadData]后,单元格的显示需要一些时间,因此在调用reloadData后立即选择一个项目不起作用。是否有一种方法可以在重新加载数据后立即选择项目?创建一个进行选择的方法,并在调用重新加载后使用performSelector调用它,例如: [self performSelector:@selector(selectIt) withObject:self afterDelay:0.1]; 确保正在主线程上调用reloadData。这可能是您的单
-[UICollectionView reloadData]
后,单元格的显示需要一些时间,因此在调用reloadData
后立即选择一个项目不起作用。是否有一种方法可以在重新加载数据后立即选择项目?创建一个进行选择的方法,并在调用重新加载后使用performSelector调用它,例如:
[self performSelector:@selector(selectIt) withObject:self afterDelay:0.1];
确保正在主线程上调用
reloadData
。这可能是您的单元格更新延迟的原因。我正在处理collectionView:cellForItemAtIndexPath:
中的单元格选择。我发现的问题是,如果单元格不存在,只需调用selectItemAtIndexPath:animated:scrollPosition:
实际上不会选择该项目
相反,你必须做:
cell.selected=YES
[m_collectionView selectItemAtIndexPath:indexPath动画:无滚动位置:UICollectionViewScrollPositionNone]代码>不要使用重新加载的数据
使用-(void)执行更新:(void(^)(void))更新完成:(void(^)(BOOL finished))完成
。完成块在单元插入/删除等动画完成后执行。您可以将对重新加载数据的调用放入(void(^)(void))更新
块苹果说:
你不应该在动画块中间调用这个方法
插入或删除项目的位置。插入和删除
自动使表的数据适当更新
实际上,你不应该在任何动画中间调用这个方法(包括在滚动中<代码> uICLoopDebug视图>代码>)。
因此,您可以使用:
[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
或者标记确定没有任何动画,然后调用reloadData
;
或
希望这对您有所帮助。我在willDisplayCell ColelActionView委托中处理了它。想法:需要一个临时变量来指定初始滚动是否已经执行(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;
}
}
}
-(void)collectionView:(UICollectionView*)collectionView将显示单元格:(UICollectionViewCell*)用于ItemAtIndexPath的单元格:(NSIndexPath*)indexPath{
//执行任何配置
如果(CGRectGetMaxX(collectionView.frame)快速方式:
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: [])
}
}
按照的思路,我发现在对collectionView执行其他操作之前,在重新加载数据
之后调用layoutifneedd
似乎可以有效地“刷新”重新加载:
[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
...
在我找到此解决方案的页面上,一些评论员指出,它在iOS 9上对他们不起作用,但它对我来说很好,因此您的里程数可能会有所不同。这就是对我起作用的原因:
我保留了所选索引路径的引用,并覆盖了reloadData函数:
override func reloadData() {
super.reloadData()
self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}
我尝试使用indexPathForSelectedItems进行此操作,但它在集合视图加载时创建了一个无限循环。我不喜欢此解决方案,因为它需要任意的时间。我们如何知道何时完成重新加载数据
?似乎无法查询此操作。对此有任何更新吗?我遇到了相同的问题,正在尝试创建UICollectionView加载期间的一个选择。并展示了如何执行此操作。当UICollectionView有很多项时,我看到动画更新调用与重新加载数据之间存在巨大的性能问题。
override func reloadData() {
super.reloadData()
self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}