【问题标题】:UIcollectionView weird cell recycling behaviourUIcollectionView 奇怪的细胞回收行为
【发布时间】:2019-07-06 04:35:31
【问题描述】:

我有一个带有流式布局的 UICollectionView,大约 140 个单元格,每个单元格都有一个简单的 UITextView。当一个单元格被回收时,我将 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 的正常行为?

【问题讨论】:

  • 你这样手动重用文本视图的目的是什么?为什么它不能只是细胞的一部分?
  • textView 只是一个例子,实际上视图更复杂,因此回收缓存通过不必在运行时创建这么多对象并简单地从缓存中修改一个来实现更流畅的性能跨度>
  • 您的缓存机制是多余的,因为您基本上在做与集合视图完全相同的事情,只是(可能)效率较低。
  • CollectionView 回收单元格,如果我拥有的每个单元格都完全相同或在运行时之前已知,那会很好,但在我的情况下不是,所以我试图缓存单元格的 contentView 以便可以在需要时对其进行修改和再次出售。
  • 您没有缓存任何以后可以可靠恢复的内容,因为您存储了文本视图,但甚至不保留有关它来自哪个单元格/索引路径的信息。这仍然使您所做的事情毫无意义 - 为什么您不能将文本视图作为单元格的子视图,在单元格离开屏幕时存储文本,并在返回时仅恢复文本?

标签: ios swift uicollectionview uicollectionviewcell


【解决方案1】:

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

  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
        }
    }
}

【讨论】:

  • 你确定这里的indexpath "texts[indexPath]" 和re​​usable cell indexPath一样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2013-12-11
  • 2010-09-24
  • 2019-08-09
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多