Ios UITableView内部的集合视图重用问题
我有一个内有CollectionView的TableView。 因此,每个表单元都是CollectionView的委托 问题是集合视图在主线程上重新加载,UITableView单元格被重用。 这会导致collectionView单元格简要显示以前单元格的标签,然后淡出更改。 当tableView最初通过返回单元格时,如何隐藏这些标签 问题发生在collection.reload()应用于行的单元格中UITableView的返回单元格之后 下面是一个代码示例Ios UITableView内部的集合视图重用问题,ios,swift,uitableview,uicollectionview,Ios,Swift,Uitableview,Uicollectionview,我有一个内有CollectionView的TableView。 因此,每个表单元都是CollectionView的委托 问题是集合视图在主线程上重新加载,UITableView单元格被重用。 这会导致collectionView单元格简要显示以前单元格的标签,然后淡出更改。 当tableView最初通过返回单元格时,如何隐藏这些标签 问题发生在collection.reload()应用于行的单元格中UITableView的返回单元格之后 下面是一个代码示例 UITableViewCell代码
- UITableViewCell代码
class CollectionDataSource:NSObject{
私有变量collectionView:UICollectionView?
变量项:[CustomItem]=[]{
迪塞特{
DispatchQueue.main.async{
让更改=[CustomItem]。更改(from:oldValue,to:self.items,identifiedBy:==,comparedBy:UICollectionView
与UITableView
相比,它本身的工作是异步的。因此,即使您直接在configureCell
中调用reloadcollectionView
,它也会在设置表后更新集合的单元格(仍然可能导致上述问题)。但您已将“reload”调用添加到DispatchQueue.main.async
中,这会使情况变得更糟
如果可能,您应该跳过使用DispatchQueue.main.async
您应该在configureCell
中用新的collectionView替换collectionView。我建议将view添加到与collection view大小和位置相同的单元格中,并在代码中添加collection view。这将保证以前的collection view永远不会出现。我想保留插座的原因是因为我使用的是dynamic heights在配置单元格函数之外计算。我正在尝试“重置”集合视图,而不是创建一个新的集合视图。这样行吗?您的意思是什么?集合视图应该在配备单元格之前指定所有约束。在这种情况下,它们不能在UITableView中动态显示。集合的高度是否固定?否集合视图的高度是动态的,取决于模型和表的高度viewcell还基于状态(可扩展)和collectionView高度动态。然后需要在UITableViewCell.configureCell()中手动更新集合的视图高度约束
。因此,当collectionView被替换时,您需要手动设置所有必需的约束,然后具有动态高度的表格单元格将正常工作。顺便说一句,您可以尝试使用代码,但更新collectionView,而不是在configure
中,而是在单元格可见时。但是,您需要删除DispatchQueue.main.async
,这是非常重要的不需要。
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)
}
}
}
}