遍历 UICollectionview 中的所有单元格
Posted
技术标签:
【中文标题】遍历 UICollectionview 中的所有单元格【英文标题】:looping through all cells in UICollectionview 【发布时间】:2013-04-20 19:26:53 【问题描述】:我有 UICollection,其中将有许多学生项目,每个项目内部都有用于记录出勤的开关。我像这样遍历所有可见的单元格。
for(attendancecollectionViewCell* cells in [[self collectionView] visibleCells])
NSLog(@"The switch value : %c",cells.attendanceSwitchLabel.isOn);
但是,我想遍历所有单元格以进行出勤,而不仅仅是可见单元格。
【问题讨论】:
除非您需要操作单元格,否则您应该遍历配置单元格的数据源。 【参考方案1】:您不能循环遍历不可见的单元格,因为这些单元格不存在。 UICollectionView 和 UITableView 一样,一旦单元格离开屏幕就会重用它们。即,如果您向下滚动,它会获取一个已滚动的单元格并将其用于即将滚动到视图中的“新”单元格。
如果您希望为集合中的条目保存状态,则必须将其与单元格本身分开存储。例如,映射到 indexPath.row 值的结构(或自定义 NSObject)的 NSArray。
对你来说更重要的问题是:你想在你的 for 循环中实现什么?
如果您需要更多信息或示例代码,请告诉我。
【讨论】:
我想我是想要访问不可见单元格的有效示例 - 如果您有一个 sec ***.com/questions/33259244/…,我的问题就在这里 “因为那些单元格不存在”:这不是真的。细胞确实存在,因为它们被重复使用。它们存在并等待被重用。但我有可复制的证据,其中单元格不在 visibleCells 中并再次使用(即:无需调用 DequeueReusableCell)。 @Softlion 我遇到了同样的问题。原来这是 ios10 的事情,即使在屏幕外,细胞有时也会留在周围。您可以通过collectionView.prefetchingEnabled = NO
禁用此行为
@Softlion 我将通知示例添加到其他问题中,该问题更具体到您的用例***.com/questions/33259244/…
如果您不想关闭预取,您可以遍历 collectionView.subviews 处理可以转换为单元格的视图。这将获得可见和屏幕外的单元格。这不是一个理想的解决方案,因为它假定 UICollectionView 将始终将单元格直接添加到自身,而不是子视图,但从 iOS 12 开始有效。【参考方案2】:
斯威夫特 4+
func getAllCells() -> [UICollectionViewCell]
var cells = [UICollectionViewCell]()
// assuming tableView is your self.tableView defined somewhere
for i in 0...self.numberOfSections-1
for j in 0...self.numberOfItems(inSection: i) - 1
if let cell = self.cellForItem(at: NSIndexPath(row: j, section: i) as IndexPath)
cells.append(cell)
return cells
【讨论】:
调用cellForItem
时,您将获得nil
用于不可见单元格。 OP 想要 ALL 个单元格。以上是关于遍历 UICollectionview 中的所有单元格的主要内容,如果未能解决你的问题,请参考以下文章
将 UICollectionView 部分中的所有项目替换为一项(组合单元格)
为 UICollectionView 中的所有 UICollectionViewCell 设置动画