在代码中选择单元格后,为什么我的自定义集合视图单元格意外为零?

时间:2015-11-04 02:35:25

标签: ios swift uicollectionview

所以我有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

正如我所说,这几乎就是背景。在第一行中,我可能会滚动到屏幕上看不到的索引。如果我这样做,然后执行第二行代码,则在调用的委托方法中创建的单元格意外为零。

1 个答案:

答案 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)
    }
}