Search code examples
iosswiftdelegatesuitextfielduilabel

How to push data from textField to label in another VC


I have mainVC with 4 labels and 4 goToVC buttons, each button use segue to present another 1 of 4 VC. Every vc have textField and doneButton. I want to show text from textField in mainVC labels and i want to use delegates. But instead i got empty labels. Please help.

Delegate.swift

protocol TextFieldDelegate {
    func didFinishTextField(text: String)
} 

MainVC.swift

class MainViewController: UIViewController, TextFieldDelegate {
    
    @IBOutlet weak var redText: UILabel!
    @IBOutlet weak var orangeText: UILabel!
    @IBOutlet weak var pinkText: UILabel!
    @IBOutlet weak var purpleText: UILabel!
    
    var choosenLabel: UILabel?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toRedVC" {
            let vc = segue.destination as! RedViewController
            vc.delegate = self
            choosenLabel = redText
        } else if segue.identifier == "toOrangeVC" {
            let vc = segue.destination as! OrangeViewController
            vc.delegate = self
            choosenLabel = orangeText
        } else if segue.identifier == "toPinkVC" {
            let vc = segue.destination as! PinkViewController
            vc.delegate = self
            choosenLabel = pinkText
        } else if segue.identifier == "toPurpleVC" {
            let vc = segue.destination as! PurpleViewController
            vc.delegate = self
            choosenLabel = purpleText
        }
    }
    
    func didFinishTextField(text: String) {
        if let data = choosenLabel {
            data.text = text
        }
    }
   
    @IBAction func redButton(_ sender: UIButton) {
    }
    @IBAction func orangeButton(_ sender: UIButton) {
    }
    @IBAction func pinkButton(_ sender: UIButton) {
    }
    @IBAction func purpleButton(_ sender: UIButton) {
    }
}

RedVC(other 3 same).swift

class RedViewController: UIViewController {

    
    var delegate: TextFieldDelegate?
    var textVar: String = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    
    @IBAction func textField(_ sender: UITextField) {
        if let data = sender.text {
            textVar = data
        }
    }
    @IBAction func doneButton(_ sender: UIButton) {
        delegate?.didFinishTextField(text: textVar)
        dismiss(animated: true, completion: nil)
    }
}

Solution

  • Everything seems ok in your code. I suggest you to check your text field's actions are set to editingChanged in ViewController.

    enter image description here