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

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

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

protocol ThanhCaHotTracksCellDelegate: class {
func handleSeeAllPressed()}

weak var delegate: ThanhCaHotTracksCellDelegate?


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

你在正确的轨道上

确保MainCollectionView(或包含它的类)实现了
而不是hcahottrackscelldelegate
协议

protocol ThanhCaHotTracksCellDelegate: class {
func handleSeeAllPressed()}

weak var delegate: ThanhCaHotTracksCellDelegate?


@objc func handleSeeAllButton(){
 delegate?.handleSeeAllPressed()
}
然后将
代表
分配为
self

类似于

类视图控制器:ThanhCaHotTracksCellDelegate{
重写func viewDidLoad(){
super.viewDidLoad()
subCollectionView.delegate=self
}
}

正如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
}

这样做的缺点是您无法直接访问手机。您可以使用
按钮。superview?
但这不是一个好主意,因为您的视图层次结构可能会更改…

您可以使用
UIButton
addTarget(\uTarget:Any?,action:Selector,for controlEvents:uicontrol事件)
方法为该按钮的特定事件添加目标/操作谢谢您的评论。我不能使用你的建议,因为我的MainCollectionView没有设置有按钮的单元格。正如我在帖子中提到的,我的sub collectionView负责这一部分。无论如何,现在,我只是使用协议将操作传递给我的sub CollectionView,然后从它传递给Main CollectionView。抱歉,我读你的问题太快了^^。但是你也可以像对待代理一样多次传递闭包…@fl034我已经多次实现闭包解决方案,现在,甚至创建了一个新的集合视图,其中一个按钮(实际上是一个tvOS TVPOSERVIEW-仍然是一个UIControl)占据了整个单元格,iAction从未被调用。设置委托后,我捕捉按下的按钮的唯一方法是通过“collectionView(collectionView:UICollectionView,didSelectItemAt indexPath:indexPath)”。我遗漏了什么???@MicheleDall'Agata你应该发布一个新问题,因为这可能是一个完全不同的问题。再添加一些关于如何构建UI的细节…@fl034没关系,我终于解决了!4天后。。这是tvOS焦点的问题,单元格被聚焦,所以UIControl无法获得动作。我修正了它,在我的问题中描述了解决方案。