Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView内部的集合视图重用问题_Ios_Swift_Uitableview_Uicollectionview - Fatal编程技术网

Ios UITableView内部的集合视图重用问题

Ios UITableView内部的集合视图重用问题,ios,swift,uitableview,uicollectionview,Ios,Swift,Uitableview,Uicollectionview,我有一个内有CollectionView的TableView。 因此,每个表单元都是CollectionView的委托 问题是集合视图在主线程上重新加载,UITableView单元格被重用。 这会导致collectionView单元格简要显示以前单元格的标签,然后淡出更改。 当tableView最初通过返回单元格时,如何隐藏这些标签 问题发生在collection.reload()应用于行的单元格中UITableView的返回单元格之后 下面是一个代码示例 UITableViewCell代码

我有一个内有CollectionView的TableView。 因此,每个表单元都是CollectionView的委托

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

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

下面是一个代码示例

  • UITableViewCell代码
class CollectionDataSource:NSObject{
私有变量collectionView:UICollectionView?
变量项:[CustomItem]=[]{
迪塞特{
DispatchQueue.main.async{

让更改=[CustomItem]。更改(from:oldValue,to:self.items,identifiedBy:==,comparedBy:
UICollectionView
UITableView
相比,它本身的工作是异步的。因此,即使您直接在
configureCell
中调用reload
collectionView
,它也会在设置表后更新集合的单元格(仍然可能导致上述问题)。但您已将“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)
                }
            }
        }
    }