从父 UICollectionViewCell 中的 UICollectionViewCell 的按钮继续

Segue from button from UICollectionViewCell inside parent UICollectionViewCell

我将 UICollectionViewCell 与父 UICollectionViewCell 中的按钮一起使用:

protocol DayCellDelegate
{
    func buttonTapped()
}

class SelectTimeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    @IBOutlet weak var collectionViewSlider: UICollectionView!    

    override func viewDidLoad() {
        super.viewDidLoad()            
        collectionViewSlider?.register(DayCollectionViewCell.self, forCellWithReuseIdentifier: "cell")
        collectionViewSlider.dataSource = self
        collectionViewSlider.delegate = self
    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! DayCollectionViewCell
        cell.dayTitle.text = String(indexPath.row)
        return cell
    }
}

class DayCollectionViewCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, DayCellDelegate {

    func buttonTapped() {
        print("button clicked")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupDayTimeline(width: frame.width, height: frame.height)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setupDayTimeline(width: CGFloat, height: CGFloat) {

        let appsCollectionView: UICollectionView = {
            let layout = UICollectionViewFlowLayout()            
            layout.itemSize = CGSize(width: 90, height: 45)
            let collectionView = UICollectionView(frame: CGRect(x: 0, y: 30, width: width, height: height - 30), collectionViewLayout: layout)            
            return collectionView
        }() 
        addSubview(appsCollectionView)

        appsCollectionView.delegate = self
        appsCollectionView.dataSource = self

        appsCollectionView.register(UINib(nibName: "TimeCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "timecell")
    }

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

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

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "timecell", for: indexPath) as! TimeCollectionViewCell
        cell.btnTime.addTarget(self, action: #selector(timeSelected), for: .touchUpInside)
        }        
        return cell
    }

    func timeSelected(){
       //here I need perform segue for SelectTimeViewController
    }
}

class TimeCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var btnTime: UIButton!    
    var delegate : DayCellDelegate?

    @IBAction func btnTimeClick(_ sender: Any) {
        self.delegate?.buttonTapped()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

如何从 DayCollectionViewCell 执行 segue? 我不能在 timeSelected() 中调用 self.performSegue(withIdentifier: "...", sender: info) 因为 UICollectionViewCell 不包含 performSegue

为包含您的集合视图的控制器创建一个协议,该协议将定义 "cell delegate" 然后您可以在控制器上调用操作,即:

protocol DayCellDelegate
{
    func buttonTapped(...)
}

您在 DayCellCollectionViewCell 或其父级中创建一个 属性,您可以将其命名为 delegate

var delegate : DayCellDelegate?

然后在 cellForItem 方法中,当你可以单元格时,将委托设置为控制器并实现它:

cell.delegate = self

最后,在您手机的点击操作中,调用:

self.delegate?.buttonTapped(...)

希望对您有所帮助,如果您需要更具体的指导,请告诉我。