Search code examples
iosswiftsegue

How to pass data from ViewController3 to ViewController1


I am new to Swift and was wondering on how to pass data from ViewController to ViewController that isn’t connected by segue. I have spend 2 hours on this and still can’t figure a way to do it.

Edit: The problem that I am confused on is How to take out all the stacked ViewController expect the root ViewController while being able to pass data back to the first ViewController from ViewController3 with 'navigationController?.popToRootViewController(animated: false)'

class ViewController: UIViewController, nameDelegate {
    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var textfield1: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        label1.text = "Name"
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc2 = segue.destination as! ViewController2
        vc2.middleOfTransferingName = textfield1.text!
    }

    @IBAction func buttonPressed1(_ sender: Any) {
        performSegue(withIdentifier: "go2", sender: self)
    }

    func nameThatWasEntered(name: String) {
        label1.text = name
    }
}

class ViewController2: UIViewController, nameDelegate {
    var middleOfTransferingName: String = ""

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc3 = segue.destination as! ViewController3
        vc3.transferedWithSegueLabelText = middleOfTransferingName
        vc3.namePassBack = self
    }

    @IBAction func buttonPressed2(_ sender: Any) {
        performSegue(withIdentifier: "go3", sender: self)
    }

    func nameThatWasEntered(name: String) {
    }
}

protocol nameDelegate {
    func nameThatWasEntered(name: String)
}

class ViewController3: UIViewController {
    @IBOutlet weak var label3: UILabel!
    @IBOutlet weak var textfield3: UITextField!

    var transferedWithSegueLabelText: String = ""
    var namePassBack: nameDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        label3.text = transferedWithSegueLabelText
    }

    @IBAction func buttonPressed3(_ sender: Any) {
        namePassBack!.nameThatWasEntered(name: textfield3.text!)
        navigationController?.popToRootViewController(animated: false)
    }
}

Solution

  • I found the way to transfer ViewController3 data to ViewController!

    var vc3 = ViewController3()
    

    then making ViewController as the delegate of vc3 upon loading.

    override func viewDidLoad() {
        super.viewDidLoad()
        vc3.namePassBack = self
    }
    

    Then going back to ViewController3, I add ""vc3."" before using the delegate.

    @IBAction func buttonPressed3(_ sender: Any) {
        vc3.namePassBack!.nameThatWasEntered(name: textfield3.text!)
        navigationController?.popToRootViewController(animated: false)
    }