How to pass in parameters into @objc function

前端 未结 2 886
野趣味
野趣味 2020-12-21 21:07

I have a cell in a tableView, with a button I want to add an action to.

The button will be an email address. When the button is pressed, I want to trigger a delegate

相关标签:
2条回答
  • 2020-12-21 21:27

    You cannot pass anything into a target's action method. You don't call the method; the target-action architecture calls it when the button is tapped. The action method must take one parameter, namely the sender (which in this case will be the button).

    If the action method needs more information at the time that it is called, you must provide that information in some other way, e.g. as an instance property that the action method can access when it is called.

    0 讨论(0)
  • 2020-12-21 21:38

    You can subclass UIButton and add a recipientEmail variable to it.

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

    Inside your cell, instead of having infoLabel as of type UIButton have it as of type 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 讨论(0)
提交回复
热议问题