如何将 collectionView 放在各自的 tableView 部分

How to placed collectionView in respective tableView Section

我有两个 collectionViews CollectionViewCellCollectionViewCellButton 我想分别放在 tableView 的第一个和第二个 section 中。我正在通过设置断点来调试它。

这是我的 tableView.swift 文件 cellForRowAt indexPath

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       
 if indexPath.section == 0{
        if let cell = tableView.dequeueReusableCell(withIdentifier: "tableviewcellid", for: indexPath) as? TableViewCell {
           
            // Show SubCategory Title

            (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).headerButton.setTitle("View All",for: .normal)


            cell.category.text = (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).category
            cell.headerButton.setTitle("View All", for: .normal)
          // Pass the data to colletionview inside the tableviewcell

            // debugging...
                    
            let v1 = colorsArray.objectsArray[indexPath.section]
                    
            // what is v1?
            print(type(of: v1))
                    
            guard let thisTableCellModel = v1 as? TableViewCellModel else {
                fatalError("Expected a TableViewCellModel !!!")
            }
                    
            let v3 = thisTableCellModel.colors[indexPath.row]

            // what is v3?
            print("123Array=",type(of: v3))  // this is an Array, not a CollectionViewCellModel
                    
            guard let rowArray = v3 as? [CollectionViewCellModel] else {
                fatalError("Expected a [CollectionViewCellModel] !!!")
            }
                    
            // if we get here, we have properly unwrapped
            //  an array of CollectionViewCellModel
                    
            // so, don't make it an Array of Array
            //cell.updateCellWith(row: [rowArray])
            print("rowArray1=",type(of: rowArray))
            
            cell.updateCellWith(row: rowArray)
 
            
            cell.selectionStyle = .none

            return cell
       }
        }
    
else if indexPath.section == 1{
        if let cell = tableView.dequeueReusableCell(withIdentifier: "tableviewcellid", for: indexPath) as? TableViewCell {
            
            (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).headerButton.setTitle("View All",for: .normal)


            cell.category.text = (colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).category
            cell.headerButton.setTitle("View All", for: .normal)
          //  if let cell = ((colorsArray.objectsArray[indexPath.section] as! TableViewCellModel).colors as! CollectionViewCellModelButton)
            
            // debugging...
                    
            let v1 = colorsArray.objectsArray[indexPath.section]
                    
            // what is v1?
            print(type(of: v1))
                    
            guard let thisTableCellModel = v1 as? TableViewCellModel else {
                fatalError("Expected a TableViewCellModel !!!")
            }
                    
            let v3 = thisTableCellModel.colors[indexPath.row]

            // what is v3?
            print("123ArraynotNotmodel=",type(of: v3))  // this is an Array, not a CollectionViewCellModel
                    
            guard let rowArray = v3 as? [CollectionViewCellModelButton] else {
                fatalError("Expected a [CollectionViewCellModelButton] !!!")
            }
            
            print("rowArray2=",type(of: rowArray))

            
                    
            cell.updateCellWith(row: rowArray)   //break point
        }
    }
        return UITableViewCell()
    }

这是在每个 section tableView

中调用的 updateCellWith 方法
  func updateCellWith(row: [CollectionViewModel]) {
            self.rowWithColors = row
            self.collectionView.reloadData()
    }

这是 TableViewCell.Swift 文件,其中包含 cellForItemAt indexPath 的 collectionView

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if indexPath.section == 0
        {
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellid", for: indexPath) as? CollectionViewCell {
           // cell.imageView = UIImage(named: (rowWithColors?[indexPath.item].image)! )
          //  CollectionViewCellModel
            ///    [CollectionViewCellModelButton
            print("index1=",indexPath.section)
            cell.imageView.image = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).imageView
            cell.dicountAmountLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).dicountAmountLabel
            cell.dicountLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).dicountLabel
            cell.customerTypeLabel.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).customerTypeLabel
            
            cell.dicountAmountLabel.textColor = .white
            cell.dicountLabel.textColor = .white
            cell.customerTypeLabel.textColor = .white
            
            return cell
        }
        }
       else if indexPath.section == 1
        {
        print("index2=",indexPath.section)

        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellButtonid", for: indexPath) as? CollectionViewCellButton {
           // cell.imageView = UIImage(named: (rowWithColors2?[indexPath.item].image)! )
          //if let model = self.rowWithColors?[indexPath.item] as? CollectionViewCellModelButton {
                //model.collectionButton.setTitle(model.collectionButton, for: .normal)
            //cell.collectionButton.titleLabel?.text = (self.rowWithColors?[indexPath.item] as! CollectionViewCellModelButton).collectionButton.setTitle("Hi", for: .normal)
            cell.collectionButton.setTitle("Hi", for: .normal)
            //
            return cell
            }
       
           
        }
        return UICollectionViewCell()
    }
    

cell.updateCellWith(row: rowArray)中设置断点在indexPath.section == 1 of cellForRowAt indexPath of tableView.The调试器不进入collectionView函数indexPath.section == 1 cellForItemAt indexPath它重新访问 indexPath.section == 0 的 collectionView 只是为了 section 0 and 1 的 tableView cellForRowAt indexPath

进入indexPath.section == 0的collectionView函数cellForItemAt indexPath给运行时间error.How我可以做到运行section 1的collectionView tableView.How 的 section 1 上的函数在 View 上显示两个 CollectionView ?就像这个图

您可以从此 google drive link 运行 下载代码以进行更好的可视化,看看需要什么

您的代码中存在多个问题,回答或修复所有问题确实不在所提问题的范围内, 我只关注崩溃:

您的代码存在强制类型转换问题。错误很明显

显然你持有 CollectionViewModel 的数组(这是一个协议)并且有两个不同的 类 证实了这个协议 CollectionViewCellModelCollectionViewCellModelButton

并且您使用

盲目地将这两种类型强制转换为 CollectionViewCellModel
(self.rowWithColors?[indexPath.item] as! CollectionViewCellModel).imageView

因此崩溃。

有什么问题?

太多了,我会指出一些与此相关的内容。 TableViewCell 中的 collectionView 总是收到 CollectionViewCellModelCollectionViewCellModelButton 的数组(一维数组)

在您的代码中,您将部分数硬编码为 1

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

但奇怪的是,在您的 cellForItemAt indexPath 中,您开始检查 indexPath.section == 0indexPath.section == 1,如果您的部分数被硬编码为 1,indexPath.section 怎么会是 1?

更奇怪的是,您尝试根据 indexPath.section 对数组 rowWithColors 中的元素进行类型转换 在您的代码中,您输入 (self.rowWithColors?[indexPath.item] as! CollectionViewCellModel) if indexPath.section == 0self.rowWithColors?[indexPath.item] as! CollectionViewCellModelButton if indexPath.section == 1

你需要什么?

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if let collectionViewCellModel = self.rowWithColors?[indexPath.row] as? CollectionViewCellModel,
           let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellid", for: indexPath) as? CollectionViewCell {
            cell.imageView.image = collectionViewCellModel.imageView
            cell.dicountAmountLabel.text = collectionViewCellModel.dicountAmountLabel
            cell.dicountLabel.text = collectionViewCellModel.dicountLabel
            cell.customerTypeLabel.text = collectionViewCellModel.customerTypeLabel

            cell.dicountAmountLabel.textColor = .white
            cell.dicountLabel.textColor = .white
            cell.customerTypeLabel.textColor = .white
            return cell
        }
       if let collectionViewCellModelButton = self.rowWithColors?[indexPath.row] as? CollectionViewCellModelButton,
          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionviewcellButtonid", for: indexPath) as? CollectionViewCellButton
        {
           //customise `CollectionViewCellButton` here with `collectionViewCellModelButton` data
           return cell
        }
        return UICollectionViewCell()
    }

O/P:

提示:

不确定为什么您在同一个文件中再次使用错误签名的 cellForItemAtIndexPath,它没有被调用是件好事,但这让我想知道为什么?我的建议,删除它:)