从集合视图重新加载数据时的多个视图

Posted

技术标签:

【中文标题】从集合视图重新加载数据时的多个视图【英文标题】:Multiple view when reloading data from collection view 【发布时间】:2019-07-22 14:36:33 【问题描述】:

我在重新加载集合视图时遇到了一个奇怪的情况,在重新加载之前,我从源中删除所有对象,然后在我的集合上调用 reloadData 并且由于某种原因集合正在添加视图但从不删除它们。 (dataSource没有重复数组总是正确的)

当我调用重载时:

        viewModel.reloadActivities()
        activityCollection.reloadData()

viewModel中的这个方法获取数据并替换数据源使用的数组:

    func reloadActivities() 
        activities.removeAll()
        fetchActivities()
    

这是一个活动单元格:

    func configure(with activity: Activity) 
        self.displayActivityCell(with: activity)
    

    func displayActivityCell(with activity: Activity) 
        let background = UIView(frame: CGRect(x: 0, y: 0, width: contentView.frame.width, height: 100))
        background.backgroundColor = #colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)
        contentView.addSubview(background)

        let label = UILabelFactory(text: activity.getMessage()).color(.black).draw()
        contentView.addSubview(label)
        label.topAnchor == background.topAnchor + 10
        label.leadingAnchor == background.leadingAnchor
        label.trailingAnchor == background.trailingAnchor
        label.translatesAutoresizingMaskIntoConstraints = false
    

但是如果我调用重新加载 X 次,结果如下...

Result when I call reload

任何提示为什么 reloadData 不“清理”添加的 contentView?

谢谢

【问题讨论】:

每次重新加载数据时,都会一遍又一遍地调用 displayActivityCell。将 UIView 实例添加到您的单元格不是一个好地方。因此,在 init 方法中添加您的视图,并在需要时隐藏/显示。 【参考方案1】:

因为对象和 UI 元素是分开的。重新加载数据仅用于数据。您是否在 indexpath 的视图控制器的 cellForRow 中调用 configure(with activity: Activity) ?如果是这样,它总是会创建一个新的背景视图并将其添加到 contentView 的子视图中。

如何将background 和标签移出到单元格的init 方法。 在displayActivityCell 函数中,您应该只自定义正在更改的内容,例如...

func displayActivityCell(with activity: Activity) 
    background.backgroundColor = #colorLiteral(red: 0.9764705896, green: 0.850980401, blue: 0.5490196347, alpha: 1)
    label.text = activity.getMessage()

【讨论】:

以上是关于从集合视图重新加载数据时的多个视图的主要内容,如果未能解决你的问题,请参考以下文章

tableview 单元格内的集合视图重新加载数据

如何自动重新加载集合视图?

如何在 UIViewRepresentable SwiftUI 中重新加载集合视图

CollectionView 标题在滚动时停止刷新/重新加载数据

重新加载集合视图数据时对成员 'collectionView(_:numberOfItemsInSection:)' 的模糊引用

TableView 单元格高度不根据第一次重新加载时的 collectionview 高度