如何通过嵌套collectionView单元传递按钮操作?

Kev*_*VuD 3 ios uicollectionview swift

我有一个MainCollectionView用于在项目之间滚动,在这些单元格之一的内部,我还有一个带有单元格的collectionView。在该集合视图中,每个单元格都有一个按钮。我的问题是在点击时如何将按钮的动作传递给MainCollectionView?我确实在单元格中为该按钮创建了协议,但是我不知道如何在点击按钮时让MainCollectionView知道。我可以从单元格类中调用动作,但我认为最好在作为MainCollectionView的Model中运行它。以下是我的按钮协议。

protocol ThanhCaHotTracksCellDelegate: class {
func handleSeeAllPressed()}

weak var delegate: ThanhCaHotTracksCellDelegate?


@objc func handleSeeAllButton(){
 delegate?.handleSeeAllPressed()
}
Run Code Online (Sandbox Code Playgroud)

fl0*_*034 5

就像NSAdi说的那样,您走在正确的道路上,但是委托模式对于诸如通知按钮按下之类的单个任务来说,开销太大。

我更喜欢使用闭包,因为它们是轻量级的,有助于将相关代码保持在一起。

使用闭包

这就是我一直在做的事情UITableView。因此,这也将起作用UICollectionView

class MyTableViewCell: UITableViewCell {
    var myButtonTapAction: ((MyTableViewCell) -> Void)?

    @IBAction func myButtonTapped(_ sender: Any) {
        myButtonTapAction?(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我将单元格从队列中移出并投射到单元格时,MyTableViewCell可以设置如下自定义操作:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCellReuseIdentifier", for: indexPath) as! MyTableViewCell

    cell.myButtonTapAction = { cell in
        // Put your button action here
        // With cell you have a strong reference to your cell, in case you need it
    }
}
Run Code Online (Sandbox Code Playgroud)

使用直接参考

当您使UICollectionView单元出队时,可以通过将单元强制转换为单元的自定义子类来获得对按钮的引用。

然后只需执行以下操作

cell.button.addTarget(self, action: #selector(didTapButton(_:)), forControlEvents: .TouchUpInside)
Run Code Online (Sandbox Code Playgroud)

并具有外部功能:

@objc func didTapButton(_ sender: UIButton) {
    // Handle button tap
}
Run Code Online (Sandbox Code Playgroud)

缺点是您无法直接访问您的单元。您可以使用,button.superview?但这不是一个好主意,因为您的视图层次结构可能会发生变化...