我有一个 TableView,里面有一个 CollectionView。 因此每个 Table 单元格都是 CollectionView 的委托(delegate)。
问题在于 Collection View 在主线程上重新加载,并且 UITableView 单元格被重用。 这会导致 collectionView 单元格短暂显示先前单元格的标签,然后淡出更改。 当 tableView 最初通过返回单元格时,如何隐藏这些标签?
问题发生的原因是在行单元格中 UITableView 的返回单元格之后应用了 collection.reload()。
这是代码示例。
- 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)
}
}
}
}
最佳答案
与 UITableView
相比,
UICollectionView
本身是异步工作的。因此,即使您直接在 configureCell
中调用 reload collectionView
,它也会在设置表格后更新集合的单元格(仍然可能导致上述问题)。但是您已将“重新加载”调用添加到 DispatchQueue.main.async 中,这使事情变得更糟。
如果可能,您应该跳过使用
DispatchQueue.main.async
。您应该在
configureCell
中将collectionView替换为新的。我建议将 View 添加到与 Collection View 相同大小和位置的单元格中,并在代码中添加 Collection View 。这将保证以前的 Collection View 永远不会出现。 👍
关于ios - UITableView 内的 Collection View 重用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253793/