如何将参数传入@objc函数

时间:2018-05-20 21:52:34

标签: swift uitableview delegates swift4 selector

我在tableView中有一个单元格,有一个按钮我想添加一个动作。

该按钮将是一个电子邮件地址。当按下按钮时,我想触发一个委托,让另一个ViewController打开一个电子邮件。但是,我需要能够将电子邮件作为参数传递,而Swift似乎并没有让我这样做。

相关代码如下:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let row = self.sections[indexPath.section].rows[indexPath.row]
       switch row {
       case .Email:
            cell.infoLabel.setTitle(cellInfo.email, for: .normal)
            cell.infoLabel.addTarget(self, action: #selector(emailPressed(recipient: cellInfo.email!)), for: .touchUpInside)
            cell.imageType.image = UIImage(named: "Email")
       }
}

@objc func emailPressed(recipient: String){
        self.delegate?.dataController(self, recipientEmail: recipient)
    }

protocol DataControllerDelegate: class {
    funcdataController(_ DataController: DataController, recipientEmail: String)
}

我收到错误:"' #selector'并不是指' @ objc'方法,属性或初始化程序"

有没有办法将电子邮件传递给@objc函数,以便它可以提供给委托函数?

2 个答案:

答案 0 :(得分:3)

您无法将任何内容传递给目标的操作方法。你不叫这个方法;当点击按钮时,目标 - 动作架构会调用它。 action方法必须带一个参数,即sender(在这种情况下是按钮)。

如果操作方法在调用时需要更多信息,则必须以其他方式提供该信息,例如:作为action方法在调用时可以访问的实例属性。

答案 1 :(得分:2)

您可以继承UIButton并为其添加recipientEmail变量。

class RecipientButton: UIButton {

    var recipientEmail: String?

    override init(frame: CGRect) {
        super.init(frame: frame)

    }

    required init(coder aDecoder: NSCoder) {
        fatalError("This class does not support NSCoding")
    }
}

在您的单元格内,而不是类型为infoLabel的{​​{1}},而不是UIButton类型

RecipientButton