【问题标题】:Load multiple UICollectionView in UITableView in view controller Swift在视图控制器 Swift 中的 UITableView 中加载多个 UICollectionView
【发布时间】:2020-03-21 10:50:24
【问题描述】:

我正在构建一个 iOS 应用程序,其中有 4 种不同的 UICollectionViewn 设计 在 UITableView 中。

UICollectionViewCell 类名有:DealCollectionViewCell、FilterCollectionViewCell、ComboCollectionViewCell、BusinessCollectionViewCell

UITableViewCell 类名有:DealTableViewCell、BusinessTableViewCell、FilterTableViewCell、ComboTableViewCell

下面是UIViewController类代码(类名HomeViewControllerr)

类扩展

UIViewController, UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource

对于 UITableView

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 返回 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
    }
}

  对于 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)
}

现在我想在 cellForItemAt 函数中添加多个 UICollectionViewCell。如下(这是我在不使用 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!
    }
}

【问题讨论】:

  • 你在上面的代码中遇到了什么问题?
  • @Hima 我在 dealUICollectionView 中有一个加载交易数组。如何在各自的 UICollectionView 中加载过滤器、组合和业务数组
  • 您可以在此方法中添加相同的条件if (collectionView == dealCollectionView) func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 并可以分别返回您的array.count。
  • @Hima 我做了它没有工作
  • @Hima 我不能将 collectionView == dealCollectionView 作为 collectionView 和 tableView 都在一个 viewController 中声明

标签: ios swift uitableview uicollectionview


【解决方案1】:
 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
    }
}
}

将集合视图添加到每个tableview单元格中并在tableview单元格中设置委托

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()
}
}

用于重新加载使用中的collectionView

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

【讨论】:

  • 嗨@gowri,我有两个collecitonviews,第一个是菜单列表,第二个是项目列表。我需要从第一个 collectionview click() 更新第二个 collection view。你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多