sofquestion 9
sofquestion 9

Reputation: 91

Load multiple UICollectionView in UITableView in view controller Swift

I am building an iOS application where there are 4 different designs of the UICollectionViewn in UITableView.

UICollectionViewCell Class Name are : DealCollectionViewCell, FilterCollectionViewCell, ComboCollectionViewCell, BusinessCollectionViewCell

UITableViewCell Class Name are : DealTableViewCell, BusinessTableViewCell, FilterTableViewCell, ComboTableViewCell

Below is UIViewController class code (Class Name HomeViewControllerr)

class extend

UIViewController, UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource

For UITableView

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 4 }

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

    if  indexPath.row == 0
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "DealTableViewCellId") as! DealTableViewCell

        return cell
    }
    else if indexPath.row == 1
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FilterTableViewCellId") as! FilterTableViewCell

        return cell
    }
    else if indexPath.row == 2
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ComboTableViewCellId") as! ComboTableViewCell

        return cell
    }
    else
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BusinessTableViewCellId") as! BusinessTableViewCell

        return cell
    }
}

  For UICollectionView

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return dealImageArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DealCollectionViewCellId", for: indexPath) as? DealCollectionViewCell

    return cell!

}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "ProductViewControllerId") as! ProductViewController
    self.present(nextViewController, animated:true, completion:nil)
    //self.navigationController?.pushViewController(nextViewController, animated: true)
}

Now I want to add multiple UICollectionViewCell in cellForItemAt function. Like below (This I had done when I was not using UITableView)

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if  (collectionView == dealCollectionView)
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DealCollectionViewCellId", for: indexPath) as? DealCollectionViewCell

        return cell!
    }
    else if  (collectionView == comboCollectionView)
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ComboColllectionViewCellId", for: indexPath) as? ComboColllectionViewCell

        return cell!
    }
    else
    {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BusinessCollectionViewCell", for: indexPath) as? BusinessCollectionViewCell

        return cell!
    }
}

Upvotes: 2

Views: 1942

Answers (1)

Gowri G
Gowri G

Reputation: 420

 extension HomeViewController : UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 4
}

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

    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "DealTableViewCell", for: indexPath) as! DealTableViewCell
        cell.DealCollectionView.dataSource = self
        cell.DealCollectionView.delegate = self
        cell.DealCollectionView.tag = 10101
        return cell
    } else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "BusinessTableViewCell", for: indexPath) as! BusinessTableViewCell
        cell.BusinessCollectionView.dataSource = self
        cell.BusinessCollectionView.delegate = self
        cell.BusinessCollectionView.tag = 10102
        return cell
    } else if indexPath.row == 2 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FilterTableViewCell", for: indexPath) as! FilterTableViewCell
        cell.FilterCollectionView.dataSource = self
        cell.FilterCollectionView.delegate = self
        cell.FilterCollectionView.tag = 10103
        return cell
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ComboTableViewCell", for: indexPath) as! ComboTableViewCell
        cell.ComboCollectionView.dataSource = self
        cell.ComboCollectionView.delegate = self
        cell.ComboCollectionView.tag = 10104
        return cell
    }
}
}

Add the collection view to each tableview cell and set delegate in tableview cell

extension HomeViewController : UICollectionViewDelegate, UICollectionViewDataSource {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if collectionView.tag == 10101 {
        return 3
    } else if collectionView.tag == 10102 {
        return 3
    } else if collectionView.tag == 10103 {
        return 3
    } else if collectionView.tag == 10104 {
        return 3
    }
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if collectionView.tag == 10101 {
        let cell = collectionView.dequeueReusableCell(withIdentifier: "DealCollectionViewCell", for: indexPath) as! DealCollectionViewCell

        return cell
    } else if collectionView.tag == 10102 {
        let cell = collectionView.dequeueReusableCell(withIdentifier: "BusinessCollectionViewCell", for: indexPath) as! BusinessCollectionViewCell

        return cell
    } else if collectionView.tag == 10103 {
        let cell = collectionView.dequeueReusableCell(withIdentifier: "FilterCollectionViewCell", for: indexPath) as! FilterCollectionViewCell

        return cell
    } else if collectionView.tag == 10104 {
        let cell = collectionView.dequeueReusableCell(withIdentifier: "ComboCollectionViewCell", for: indexPath) as! ComboCollectionViewCell

        return cell
    }

    return UICollectionViewCell()
}
}

For reload the collectionView in use

if let cell = self.tableView.cellForRow(at: IndexPath(row: i, section: 0)) as? tableViewCell {
cell.collectionView.reloadData()
}

Upvotes: 4

Related Questions