Как передать параметры в функцию @objc - PullRequest
0 голосов
/ 21 мая 2018

У меня есть ячейка в 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 голосов
/ 21 мая 2018

Вы можете создать подкласс 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 для типа UIButton иметь его для типа RecipientButton

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.recipentEmail = cellInfo.email
            cell.infoLabel.addTarget(self, action: #selector(emailPressed(_ :)), for: .touchUpInside)
            cell.imageType.image = UIImage(named: "Email")
    }
}

@objc func emailPressed(_ sender: RecipientButton) {
    guard let email = sender.recipientEmail else { return }
    self.delegate?.dataController(self, recipientEmail: email)
}
0 голосов
/ 21 мая 2018

Вы не можете ничего передать в метод действия цели.Вы не вызываете метод;архитектура целевого действия вызывает его при нажатии кнопки.Метод действия должен принимать один параметр, а именно отправителя (который в данном случае будет кнопкой).

Если метод действия требует больше информации во время его вызова, вы должны предоставить эту информацию в некоторыхдругим способом, например, как свойство экземпляра, к которому метод действия может обращаться при его вызове.

...