所以我有colectionView
张图片,当后台发生某些事情时,我可能会尝试使用以下方法选择特定的自定义collectionViewCell
:
self.collectionView.selectItemAtIndexPath(indexPathToReload, animated: true, scrollPosition: UICollectionViewScrollPosition.CenteredVertically)
,工作正常,collectionView
滚动到所需位置。
然而,如果我尝试实际更新单元格的外观,因为它已经通过调用self.collectionView(self.collectionView, didSelectItemAtIndexPath: indexPathToReload)
进行了更新,当我尝试在{{1}中创建单元格时,我得到一个意外的无效单元格}}。
我部分理解为什么这种更新单元格的方法不安全(正如我在研究像here in one of the answers这样的问题时所读到的那样。)
因此,崩溃使我假设细胞不是屏幕上可见细胞的一部分,这就是为什么当我尝试创建它时细胞是零的原因。但这并没有意义,因为我还假设必须创建单元格以便滚动到,正如我所说的那样工作罚款,因为它们按预期创建并且可以毫无问题地进行交互。
那为什么我的手机没有?或者为什么我的集合视图不认为滚动的单元格不属于可见单元格?如果原因很明显,那么当我在代码中选择它时,如何让单元格更新呢?
编辑:上下文中的代码
didSelectItemAtIndexPath
正如我所说,这几乎就是背景。在第一行中,我可能会滚动到屏幕上看不到的索引。如果我这样做,然后执行第二行代码,则在调用的委托方法中创建的单元格意外为零。
答案 0 :(得分:0)
为了解决这个问题,我不得不使用一种hacky解决方法,虽然工作似乎太脏了,但我不知道为什么Apple没有解决这个问题(即为什么selectItemAtIndexPath
没有调用委托方法didSelectItemAtIndexPath
)。无论如何,我最终做的是当我需要在后台更新我选择的单元格时,我首先获得索引并设置bool以显示在代码中选择了单元格:
dispatch_async(dispatch_get_main_queue()) {
self.collectionView.selectItemAtIndexPath(indexPathToReload, animated: true, scrollPosition: UICollectionViewScrollPosition.CenteredVertically)
let cell = self.collectionView.cellForItemAtIndexPath(indexPathToReload) as? ListingCollectionViewCell
if cell != nil {
self.collectionView(self.collectionView, didSelectItemAtIndexPath: indexPathToReload)
return
} else {
self.buttonSelectedInCode = true
self.indexPathSelectedInCode = indexPathToReload
return
}
}
上面,我不得不尝试为指定的索引路径创建单元格。如果单元格不是,那么我知道单元格是可见的,并且可以安全地调用代理didSelectItemAtIndexPath
。但是,如果单元格为nil,那么我必须设置我的bool和index,并等待滚动视图调用委托方法,如下所示。
然后,我进一步实现了scrollViewDidEndScrollAnimation
并使用了这个委托方法的调用,然后在代码中选择我的单元格,如下所示:
func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
if buttonSelectedInCode {
self.collectionView(self.collectionView, didSelectItemAtIndexPath: self.indexPathSelectedInCode)
}
}