【问题标题】:Collection View inside UITableView reuse issueUITableView 内的集合视图重用问题
【发布时间】:2019-12-09 17:25:17
【问题描述】:

我有一个 TableView,里面有一个 CollectionView。 所以每个 Table 单元格都是 CollectionView 的代表。

问题是集合视图在主线程上重新加载,并且 UITableView 单元被重用。 这会导致 collectionView 单元格简要地显示先前单元格的标签,然后淡化更改。 当 tableView 最初通过返回单元格时,如何隐藏这些标签?

这个问题发生在collection.reload() 是在UITableView 的返回单元格中的行单元格之后应用的。

这是代码示例。

  • UITableViewCell 代码
let collectionDatasource = CollectionDataSource()

func configureCell(_ object: CustomClass) {

        //Configure Object for tableView
        self.presentedObject = object
        self.nameLabel.text = object.name

        //Set object and items on collection datasource
        DispatchQueue.main.async {
            let collectionItems = object.collectionItems ?? []
            self.collectionDatasource.object = object
            self.collectionDatasource.items = collectionItems
        }
    }
class CollectionDataSource: NSObject {
    private var collectionView: UICollectionView?
    var items: [CustomItem] = [] {
        didSet {
            DispatchQueue.main.async {
                let changes = [CustomItem].changes(from: oldValue, to: self.items, identifiedBy: ==, comparedBy: <)
                self.collectionView?.apply(changes: changes)
            }
        }
    }
}

【问题讨论】:

    标签: ios swift uitableview uicollectionview


    【解决方案1】:

    UICollectionView 本身与UITableView 相比,它的工作是异步的。因此,即使您直接在configureCell 中调用 reload collectionView,它也会在设置表格后更新集合的单元格(仍然可能导致上述问题)。但是您在DispatchQueue.main.async 中添加了“重新加载”调用,这使情况变得更糟。

    1. 如果可能,您应该跳过使用DispatchQueue.main.async

    2. 您应该用configureCell 中的新集合替换collectionView。我建议将视图添加到与集合视图相同大小和位置的单元格中,并在代码中添加集合视图。这将保证以前的集合视图永远不会出现。 ?

    【讨论】:

    • 我想保留插座的原因是因为我使用了在配置单元函数之外计算的动态高度。我试图“重置”集合视图而不是创建一个新视图。这行得通吗?
    • 什么意思? collectionView 应该具有在配备单元之前指定的所有约束。在这种情况下,它们不能在 UITableView 内动态。集合的高度是固定的吗?
    • 不,集合视图的高度是动态的,基于模型和 tableviewcell 的高度,也基于状态(可扩展)和 collectionView 高度动态。
    • 那么您需要在UITableViewCell .configureCell() 中手动更新集合的视图高度约束。因此,当collectionView被替换时,您需要手动设置所有必需的约束,然后具有动态高度的表格单元格将正常工作。
    • 顺便说一句,您可以尝试使用您的代码,但不是在configure 中更新collectionView,而是在单元格变得可见时更新。但是,您需要删除DispatchQueue.main.async,不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2014-11-13
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多