在#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 调用中快速传递参数的主要内容,如果未能解决你的问题,请参考以下文章