获取不可见的 CollectionView 单元格

Posted

技术标签:

【中文标题】获取不可见的 CollectionView 单元格【英文标题】:Get CollectionView cells that are invisible 【发布时间】:2019-07-14 19:21:21 【问题描述】:

简介

我知道这个话题已经在 *** 和 我知道 Collection View 会回收其单元格

但是,对于我遇到的问题,我还没有找到合适的解释 描述如下。

问题

在我的应用中,我有一个集合视图,其中包含多种单元格类型 - 每个单元格在集合视图中仅存在一次

集合视图就像一个表单,用户可以在其中输入不同的内容 - 分成几个单元格。

如果我现在向下滚动,第一个单元格将不再不可见。但是,它也不会从集合视图中删除,因为如果我滚动回顶部,输入的数据仍会正确显示。

如果用户单击按钮,我将获取每个集合视图单元格 从集合视图中运行验证方法。

就像下面这样:

let firstCell = myCollectionView.cellForItem(at: IndexPath(row: 0, section: 0)) as! DefaultElementCell // get the cell

firstCell.validateEntries() // validates entries and highlights incorrect fields

如果我现在滚动到集合视图的底部(最后一个单元格),我会收到一个错误“在展开可选值时意外发现 nil”。在这种情况下,可选值是应该由 cellForItemAt() 返回的 Cell。

所以,我认为该单元格已被删除,但另一方面 将文本输入到字段中,一切仍然存在 如果我滚动回第一个单元格。

我尝试了什么:

if let firstCell = myCollectionView.dataSource?.collectionView(self.myCollectionView, cellForItemAt: IndexPath(row: 0, section: 0)) 
            print((firstCell as! DefaultElementCell).validateEntries()) // does nothing

现在,我不再收到“意外发现 nil”错误,但 validateEntries() 也不再执行任何操作

有什么方法可以正确获取不可见的集合视图单元格或防止集合视图重复使用单元格?如前所述,每个单元格类型在集合视图中只存在一次。

我将不胜感激!

【问题讨论】:

您似乎(错误地)使用单元格作为数据源。 你使用什么样的 ui 元素?? 所有文本字段@Sh_Khan @MartinR 你介意解释一下我的误解吗?非常感谢:) 单元格仅用于显示数据。实际数据应始终在您的模型对象中。 【参考方案1】:

您需要创建一个与单元格数量相同大小的数组,然后

var arr = [String]() 

 // inside cellForRowAt 
cell.textfield.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: UIControl.Event.editingChanged
cell.textfield.tag = indexPath.item

@objc func textFieldDidChange(_ textField: UITextField) 
   arr[textfiled.tag] = textfield.text!

然后验证来自arr 值的条目

【讨论】:

以上是关于获取不可见的 CollectionView 单元格的主要内容,如果未能解决你的问题,请参考以下文章

尝试在collectionview中为不可见单元格设置动画时如何防止延迟

`UICollectionViewLayout` 如何访问不可见单元格的数据?

仅更改一个 collectionview 单元格的对象

无法从 UITest 中的 CollectionView 元素访问单元格

单元格部分可见的 UICollectionView

动态大小的 collectionView 单元格导致可见性问题 - iOS