在单元格内的集合视图中实现didSelect

时间:2018-02-12 09:18:53

标签: ios swift uitableview uicollectionview

我正在尝试从表视图单元格内的集合视图执行segue,视图看起来像这样

enter image description here

为了解释清楚,我有一个表格视图,每一行都有一个单元格,在第二行内部,我有一个包含多个产品的集合视图

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.row {
    case 0:
        let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell", for: indexPath)
        return cell
    case 1:
        let cell = tableView.dequeueReusableCell(withIdentifier: "ItemTitle", for: indexPath)
        return cell
    case 2:
        let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath)
        return cell
    case 3:
        let cell = tableView.dequeueReusableCell(withIdentifier: "SectionTitle", for: indexPath)
        return cell
    case 4:
        let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionCell", for: indexPath) as! CollectionCell
        return cell
    default:
        let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionCell", for: indexPath) as! CollectionCell
        return cell
    }
}

在我的ItemCell类中,我有以下

@IBOutlet weak var collectionView: UICollectionView!
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "singleItemCell", for: indexPath) as! singleItemCell

    cell.itemImage.image = images[indexPath.row]
    cell.itemImage.contentMode = .scaleAspectFit


    return cell
}

我想执行一个segue,例如当用户从集合视图中选择一个单元格时,它会将他带到另一个视图控制器。我怎样才能做到这一点 ?

我尝试了执行塞片,但由于我在细胞类

,因此它不允许我

请提示?

3 个答案:

答案 0 :(得分:1)

在你的ItemCell类中,为这个引用你的ViewController创建一个变量:

var productVC:UIVIewController?

加载TableView Cell时设置对self的引用,如下所示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.row {
    case 2:
        let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath)
        cell.productVC = self
        return cell
    default:
        let cell = tableView.dequeueReusableCell(withIdentifier: "CollectionCell", for: indexPath) as! CollectionCell
        return cell
    }
}

然后在ItemCell类

中实现didSelect UICollectionView委托方法
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
   productVC.performSegue(withIdentifier: "pass your segue identifier here..", sender: nil)
}

答案 1 :(得分:0)

实施UICollectionViewDataSourceUICollectionViewDelegate不在tableView单元格中,而是在ViewController中。 您可以使用cellForRowAtIndexPath方法访问collectionView,这样您就可以将dataSourcedelegate分配给self

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.row {
    case 0:
        let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell", for: indexPath)
        return cell
    case 1:
        if let cell = tableView.dequeueReusableCell(withIdentifier: "ItemTitle", for: indexPath) as? ItemCell {
            cell.collectionView?.delegate = self
            cell.collectionView?.dataSource = self
            return cell
        }
    ...
    }
}

ViewController开始,您可以制作performSegue方法

答案 2 :(得分:0)

 protocol ProductCellDelegate: class {
       func didChoosedProduct(item: ItemImage)
    }

     class ProductCell {

            @IBOutlet weak var collectionView: UICollectionView!

            // Your Model Array
            var itemImages: [ItemImages] = [] {
                didSet { 
                    self.collectionView.reloadData()
             } 
            // Must set the delegate to your viewcontroller object in tableviewcell cell for rowat indexpath method
            weak var delegate: ProductCellDelegate?

            override func awakeFromNib() {
                  self.collectionView.delegate = self
              }
        }

    extension ProductCell: UICollectionViewDelegate {

     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let selectedItem = self.itemImages[indexPath.row]
        self.delegate?.didChoosedProduct(item: selectedItem)
    }
  }

在viewcontroller中实现ProductCellDelegate。将performsegue称为导航。