在#selector 调用中快速传递参数

Posted

技术标签:

【中文标题】在#selector 调用中快速传递参数【英文标题】:Swift passing parameters in #selector calls 【发布时间】:2019-10-29 14:11:47 【问题描述】:

总结一下我的问题:我有一张更大的桌子,里面有很多来自不同人的帖子。我正在使用 tableview 的数据源浏览我的 tablecells 列表,如下例所示。我想给单元格的每个文本标签一个点击监听器。所以我在我的表格数据源的 cellForRowAt 中提出了这个:

    let tap = UITapGestureRecognizer(target: self, action: #selector(clickedOnLabel(sender:, content: local[indexPath.row][2],rank: rank)))
    cell.textLabel?.isUserInteractionEnabled = true
    cell.addGestureRecognizer(tap)

所以我想在这里添加这个点击功能,它需要参数内容并与之排名:

@objc func clickedOnLabel(sender: UITapGestureRecognizer, content: String, rank: Int)

    //Do some stuff here


但是我不允许通过选择器传递内容和排名,当我放置内容和排名时,一切正常......所以它只是语法吗?

【问题讨论】:

【参考方案1】:

这是一个小例子,说明如何使用闭包来实现这一点。

cell.updateParent =  [weak self] score, rank in
    // Do magic here

在你的单元格类中,你应该添加类似

var updateParent: ((Double, Int) -> Void)?

@IBAction func doMagicInParent(_ sender: Any) 
    updateParent?(score, rank)

这也可以通过使用委托来实现。或者您也可以通过通知中心传递数据。

Notification center example

Delegate example

【讨论】:

【参考方案2】:

这是使用委托的解决方案:

在您的自定义单元格中

protocol MyCustomCellDelegate
    func didTapOnLabel(content: String, rank: Int)


var delegate: MyCustomCellDelegate?

当点击发生时,调用

self.delegate?.didTapOnLabel(content: "my content", rank: 100)

在您的 CellForRowAt 函数中

cell.delegate = self

并符合委托:

extension YouViewController: MyCustomCellDelegate
    func didTapOnLabel(content: String, rank: Int)
        // do your stuff
    

【讨论】:

但是我怎么知道要填写我的内容并在您的“当点击发生时,调用”时排名,因为我无法通过我的目标函数?而且我不能给我的细胞一个代表...... 这里还有一个问题,如果您在原始问题中甚至没有提到这一点,我们怎么知道您不能通过您的 Objective-c 函数? @CaipiDE 你需要在目标c函数实现中触发委托函数。我还展示了如何为您的单元进行委派。请仔细阅读说明。

以上是关于在#selector 调用中快速传递参数的主要内容,如果未能解决你的问题,请参考以下文章

怎么向selector传递多个参数?

如何将@selector 作为参数传递?

使用UITapGestureRecognizer传递参数

在 Swift 4 中传递给不带参数的调用的参数

使用 AFNetworking 快速传递参数

将自定义参数传递给 uibutton #selector swift 3