如何从嵌套的collectionView单元格传递按钮操作?

时间:2018-02-14 08:34:37

标签: ios swift uicollectionview

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

protocol ThanhCaHotTracksCellDelegate: class {
func handleSeeAllPressed()}

weak var delegate: ThanhCaHotTracksCellDelegate?


@objc func handleSeeAllButton(){
 delegate?.handleSeeAllPressed()
}

2 个答案:

答案 0 :(得分:3)

LIke NSAdi说,你正处于正确的轨道上,但代表模式只需要一个单独的任务,比如通知按钮按下。

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

使用闭包

这就是我在UITableView中一直在做的事情。所以这也适用于UICollectionView

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

    @IBAction func myButtonTapped(_ sender: Any) {
        myButtonTapAction?(self)
    }
}

因此,当我将单元格出列并将其转换为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
    }
}

使用直接引用

当您将UICollectionView单元格出列后,您可以通过将单元格强制转换为单元格的自定义子类来获取对按钮的引用。

然后只需执行以下操作

cell.button.addTarget(self, action: #selector(didTapButton(_:)), forControlEvents: .TouchUpInside)

外面有一个功能:

@objc func didTapButton(_ sender: UIButton) {
    // Handle button tap
}

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

答案 1 :(得分:0)

你走在正确的轨道上。

确保MainCollectionView(或包含它的类)实现ThanhCaHotTracksCellDelegate协议。

然后将delegate指定为self

像...一样的东西。

class ViewController: ThanhCaHotTracksCellDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        subCollectionView.delegate = self
    }
}