配置 UICollectionView 以保持相同的单元格视图

Posted

技术标签:

【中文标题】配置 UICollectionView 以保持相同的单元格视图【英文标题】:Configuring UICollectionView to keep the same cell view 【发布时间】:2016-02-03 12:48:46 【问题描述】:

我有一个集合视图委托

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath)
    -> UICollectionViewCell 

我希望单元格的属性在每次调用此方法之间保持不变。

let cell = levelView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier,
      forIndexPath: indexPath)

但使用dequeueReusableCellWithReuseIdentifier 检索单元格似乎会创建一个与初始元素不同的新单元格视图元素。

cell.accessibilityIncrement()

因此,在点击单元格后,单元格可访问性值无法保留。 我需要这样做,因为我想通过点击单元格来进行 UI 测试。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

ios 中的可重用单元是通过队列处理的。这有助于 tableViews 和 collectionViews 平滑移动并在处理大量数据时保持高效。我认为您不会想要更改设计为在您的应用程序中工作的方式。这样,设备只需将尽可能多的单元格加载到内存中即可在单个屏幕上显示。随着单元格移出屏幕,它们可以作为另一个单元格重复使用,因为将调用 cellForItemAtIndexPath 将所需的数据加载到重复使用的单元格中。

如果目标是在单元格重新加载之间保持值,请考虑使用地图或其他可以由 collectionView 的 dataSource 委托管理的类似变量。

例如,在包含 dataSource 委托的 viewController 中,您可以像这样定义 Dictionary

let numberOfTapsByIndexPath = [NSIndexPath: Int]()

然后每次点击一个单元格时,您都会在地图中为点击的单元格增加值。该代码可能如下所示:

let previousTaps = numberOfTapsByIndexPath[indexPath] numberOfTapsByIndexPath[indexPath] = previousTaps + 1

我不能 100% 确定这是您在上面解释的目标,但无论如何,您都希望将任何持久性信息移出单元格并放入 dataSource 委托或其他单例可以管理的变量中。

希望这会有所帮助!

【讨论】:

感谢您的回答。实际上,我的目标是进行 UI 测试,我想检查单元格的 backgroundView 属性是否发生了变化。我不确定是否值得为测试添加一个额外的变量。关于如何做到这一点的任何想法? 如果您只需要每个单元格上的唯一标识符以实现可访问性,请考虑将可访问性标识符分配给可以在代码中确定的内容,例如 cell.accessibilityIdentifier = "CollectionCell-\(indexPath.section)-\(indexPath.item)"

以上是关于配置 UICollectionView 以保持相同的单元格视图的主要内容,如果未能解决你的问题,请参考以下文章

即使我们滚动,如何将部分标题保持在顶部:UICollectionView

手动滚动显示相同内容的两个 UICollectionView

如何以编程方式创建和使用 UIcollectionView?

UICollectionView 未显示以查看

UICollectionView 中具有可变项目大小的恒定行距

向上滚动时保持 UICollectionView 中的滚动位置