UIcollectionView怪异的细胞回收行为

时间:2019-02-12 13:52:58

标签: ios swift uicollectionview uicollectionviewcell

我有一个带有流布局的UICollectionView,每个带有一个简单的UITextView的约140个单元格。回收单元格后,我将textView弹出到缓存中,稍后在新的单元格上重复使用。一切正常,直到我到达底部并向上滚动。到那时,我可以看到CollectionView出售单元号85,但是在显示单元格85之前,它再次为单元格87进行了回收,因此现在我丢失了刚刚准备的单元格的内容。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

   let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FormCell", for: indexPath) as! FormCollectionViewCell
   let textView = Cache.vendTextView()
   textView.text = "\(indexPath.row)"
   cell.addSubview(textView)
   cell.textView = textView

   return cell

}

在UIcollectionViewCelC上

override func prepareForReuse() {

   super.prepareForRuse()
   self.textView.removeFromSuperView()
   Cache.returnView(self.textView)

}

我本以为在调用cellForItemAtIndexPath()之后,会将其从可重复使用的单元池中删除,但似乎立即又将其回收用于相邻单元。可能是错误,或者我可能误解了UICollectionView的正常行为?

enter image description here

1 个答案:

答案 0 :(得分:0)

据我了解,您要尝试的只是跟踪单元格内容-在单元格消失时保存它,在单元格再次出现时恢复它。您正在做的事情由于以下几个原因无法正常工作:

  1. vendTextViewreturnView并不使用indexPath作为参数-您的缓存正在存储某些内容并正在获取某些内容,但是您无法知道正在存储/为其正确的单元格获取

  2. 缓存整个文本视图没有意义-为什么不缓存文本呢?

尝试类似的方法:

让您的FormCollectionViewCell仅将文本视图作为子视图,然后像这样修改代码:

class YourViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 
{
    var texts = [IndexPath : String]()

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FormCell", for: indexPath)
        if let formCell = cell as? FormCollectionViewCell {
            cell.textView.text = texts[indexPath]

            return cell
        }
    }

    func collectionView(_ collectionView: UICollectionView, 
        didEndDisplaying cell: UICollectionViewCell, 
               forItemAt indexPath: IndexPath)
    {
        if let formCell = cell as? FormCollectionViewCell {
        {
            texts[indexPath] = formCell.textView.text
        }
    }
}