Why two collection views in two table view cells won't work in swift 4 mode?

I read similar questions like how to have multiple views of a collection in multiple cells of a table view and I have connected collection cells and used id names for them, but I don’t know why I am getting this error:

* Application termination due to uncaught exception "NSInternalInconsistencyException", reason: "cannot remove the view of the view: UICollectionElementKindCell with the identifier extera_infoCollectionViewCell - must register a nib or class for the identifier or include a cell prototype in the storyboard" * First throw call stack:

** Remember I read similar questions and the first cell of a combo table works well and the problem is that it is the second. ** here is my code for the main view controller which has a table view and the table view has two cells

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if collectionView == fieldOfActivityCell().fieldofActivitiesCollectionView {
    let fullfields : String = self.adv.resultValue[0].work_field!
    let fullfieldsArr : [String] = fullfields.components(separatedBy: ",")
    print(fullfieldsArr)
    return fullfieldsArr.count

    } else {

            let extera_infofields : String = self.adv.resultValue[0].extera_info!
            let extera_infofieldsArr : [String] = extera_infofields.components(separatedBy: ",")
            print(extera_infofieldsArr)
            return extera_infofieldsArr.count



    }
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


    if collectionView == fieldOfActivityCell().fieldofActivitiesCollectionView {

        let fieldsCells = collectionView.dequeueReusableCell(withReuseIdentifier: "fieldOfActivityCollectionViewCell", for: indexPath) as! fieldOfActivityCollectionViewCell



    let fullfields : String = self.adv.resultValue[0].work_field!
    let fullfieldsArr : [String] = fullfields.components(separatedBy: ",")

    fieldsCells.title.text = fullfieldsArr[indexPath.row]

    return fieldsCells

    }

    else {



        let extera_infoCells = collectionView.dequeueReusableCell(withReuseIdentifier: "extera_infoCollectionViewCell", for: indexPath) as! extera_infoCollectionViewCell



        let extera_info : String = self.adv.resultValue[0].extera_info!
        let extera_infoArr : [String] = extera_info.components(separatedBy: ",")

        extera_infoCells.infoText.text = extera_infoArr[indexPath.row]

        return extera_infoCells





    }

    }

      

and here are the codes of the table view in the same view controller

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


if indexPath.row == 0{

        let fieldCell = self.showAdvTableView.dequeueReusableCell(withIdentifier: "fieldOfActivityCell", for: indexPath) as! fieldOfActivityCell



        return fieldCell

} else {

  let fieldCell = self.showAdvTableView.dequeueReusableCell(withIdentifier: "extera_infoCell", for: indexPath) as! extera_infoCell

            return fieldCell

}

      

here is the class of the first cell of the table

class fieldOfActivityCell: UITableViewCell {

@IBOutlet weak var fieldofActivitiesCollectionView: UICollectionView!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    if let flowLayout = fieldofActivitiesCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.estimatedItemSize = CGSize.init(width: 1.0, height: 1.0) }
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

extension fieldOfActivityCell {

func setCollectionViewDataSourceDelegate
            <D: UICollectionViewDelegate & UICollectionViewDataSource>
    (_ dataSourceDelegate:D , forRow row : Int )

{

    fieldofActivitiesCollectionView.delegate = dataSourceDelegate
    fieldofActivitiesCollectionView.dataSource = dataSourceDelegate
    fieldofActivitiesCollectionView.reloadData()
}




}

      

and here is the second tableview cell class

 @IBOutlet weak var extra_infoCollectionView: UICollectionView!

override func awakeFromNib() {
    super.awakeFromNib()

    if let flowLayout = extra_infoCollectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.estimatedItemSize = CGSize.init(width: 1.0, height: 1.0) }
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

 extension extera_infoCell {

func setCollectionViewDataSourceDelegate
    <D: UICollectionViewDelegate & UICollectionViewDataSource>
    (_ dataSourceDelegate:D , forRow row : Int )

{

    extra_infoCollectionView.delegate = dataSourceDelegate
    extra_infoCollectionView.dataSource = dataSourceDelegate

    extra_infoCollectionView.reloadData()
}




  }

      

enter image description here

+2


source to share


3 answers


the answer is using the tags I just need to use the tag for them, and use if else select which kind of collection is selected with the tag, so the answer is:

if collectionView.tag == 49 {
do some thing//////
}else {
do some thing else}

      



and I have to use this in cellForRowAtIndexPath and numberOfRows methods that you can use for table view.

+1


source


According to your error, your reuse id doesn't match any cell in your storyboard. Click on the extera_info cell collectionView in the interface builder. Select the attribute inspector tab. In the reuse id, make sure you type extera_infoCollectionViewCell



0


source


If you take a different tableview cell In a different class, with storyboard NSObject functions, this might help you and is easy to maintain.

0


source







All Articles