遍历 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 / FlowLayout

为 UICollectionView 中的所有 UICollectionViewCell 设置动画

UiCollectionview 允许对特定单元格进行单选

UIScrollView 中的 UICollectionView 加载所有单元格

UICollectionView 不显示模拟器中的所有单元格