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

时间:2019-10-29 14:11:47

标签: swift onclick uigesturerecognizer uitapgesturerecognizer

总结一下我的问题:我有一个更大的桌子,上面有很多来自不同人的帖子。我正在遍历表单元的列表以及tableview的数据源,如以下示例所示。我想给单元格的每个textlabel一个单击侦听器。因此,我在表格数据源的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

}

但是我不允许通过选择器传递内容和排名,当我放置内容并进行排名时,一切正常……那仅仅是语法吗?

2 个答案:

答案 0 :(得分:0)

这是一个如何使用闭包实现此目标的小例子。

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

答案 1 :(得分:0)

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

在您的自定义单元格中

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