我有一个带有流布局的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的正常行为?
答案 0 :(得分:0)
据我了解,您要尝试的只是跟踪单元格内容-在单元格消失时保存它,在单元格再次出现时恢复它。您正在做的事情由于以下几个原因无法正常工作:
vendTextView
和returnView
并不使用indexPath
作为参数-您的缓存正在存储某些内容并正在获取某些内容,但是您无法知道正在存储/为其正确的单元格获取
缓存整个文本视图没有意义-为什么不缓存文本呢?
尝试类似的方法:
让您的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
}
}
}