我在CollectionViewCell内部有一个UIButton,它又在TableViewCell内部。如何单击UIButton导航到下一个视图控制器?

时间:2019-01-21 05:42:06

标签: ios swift uitableview uicollectionview

我在UIButton内的UICollectionViewCell内有UITableViewCell,在点击该UIViewController时,我需要导航另一个UIButton。但是UINavigationControllerUICollectionViewCell内部不起作用。有人可以帮忙吗?

我在代码中找不到任何NavigationController。

import UIKit

class TrendingProductTVCell: UITableViewCell {

    @IBOutlet weak var trendingProductCV: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()
        trendingProductCV.delegate = self
        trendingProductCV.dataSource = self
    }
}


extension TrendingProductTVCell: UICollectionViewDataSource, UICollectionViewDelegate {

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = trendingProductCV.dequeueReusableCell(withReuseIdentifier: "TrendingProductsCVCell", for: indexPath) as? TrendingProductsCVCell
        cell?.trendingAddToCartBtn.addTarget(self, action: #selector(addToCartBtnTapped), for: .touchUpInside)
        return cell!
    }

    @objc
    func addToCartBtnTapped(sender: UIButton){
       let productDetail = trendingProductsDataArray[sender.tag]
    }
}

4 个答案:

答案 0 :(得分:3)

您可以使用委托协议。

protocol TrendingProductTVCellDelegate {
    func addToCart(product: Product)
}

class TrendingProductTVCell: UITableViewCell {
    var delegate: TrendingProductTVCellDelegate?
}

extension TrendingProductTVCell: UICollectionViewDataSource, UICollectionViewDelegate {
    @objc func addToCartBtnTapped(sender: UIButton){
       let productDetail = trendingProductsDataArray[sender.tag]
       delegate?.addToCart(product: productDetail)
    }
}

UINavigationController只能通过ViewController访问。因此,您的TrendingProductViewController必须先监听协议,然后才能访问navigationController。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = ... // your TrendingProductTVCell
    cell.delegate = self // <- important
    ...
}

extension TrendingProductViewController: TrendingProductTVCellDelegate {
    func addToCart(product: Product) {
        navigationController.push() // your rest code here....
    }
}

答案 1 :(得分:1)

您可以做两件事之一

 1.使用 NotificationCenter 发布通知,然后发送      userInfo 中的 productDetail ,并在 ViewController 中监听通知,该通知包含您的 tableView
 2.或者,您可以使用要在选择产品时触发的方法,简单地创建一个协议,在 TableViewCell 中添加一个 delegate 属性。 strong>,在创建单元格时在 cellForRowAt:中发送控制器的参考,并在选择产品时在该委托上调用方法。

尽管我更喜欢使用第二种方法,但是通过两种方式,您将能够处理新视图控制器的推送。

答案 2 :(得分:0)

使用代理:通过代理,您可以向呼叫者提供更多信息,在这种情况下它更加灵活。最佳解决方案使用委托。

答案 3 :(得分:0)

您可以使用此扩展程序为任何视图获取parentViewController:

extension UIView {
  var parentViewController: UIViewController? {
    var parentResponder: UIResponder? = self
    while parentResponder != nil {
        parentResponder = parentResponder!.nextResponder()
        if parentResponder is UIViewController {
            return parentResponder as! UIViewController!
        }
    }
    return nil
  }
}

然后,您将可以在UITableViewCellUICollectionViewCell中访问parentViewController。为此父ViewController获取navController,然后从UICollectionViewCell内部推送到下一个。