从集合视图重新加载数据时的多个视图
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()
【讨论】:
以上是关于从集合视图重新加载数据时的多个视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIViewRepresentable SwiftUI 中重新加载集合视图
CollectionView 标题在滚动时停止刷新/重新加载数据
重新加载集合视图数据时对成员 'collectionView(_:numberOfItemsInSection:)' 的模糊引用