【发布时间】: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