Tobias Ruano
Tobias Ruano

Reputation: 37

How Swift code is excecuted in Xcode

I've got a Problem. I'm new to iOS programming, and i'm struggling to understand how Swift code is excecuted. For example, in the piece of code below, I would think that every line is executed right after the one above. But when it reaches the passData() function, it does not ejecute that fuction. it keeps going, and some time later (or erlier) it excecutes it (the passData function).

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if numLaunches == 0{
        nombre = usuario()
        numLaunches += 1
    }
}

func usuario() -> String {
    var tField: UITextField!

    func configurationTextField(textField: UITextField!)
    {
        print("generating the TextField")
        textField.placeholder = "Enter an item"
        textField.textAlignment = .center
        tField = textField
    }

    func handleCancel(alertView: UIAlertAction!)
    {
        print("Cancelled !!")
    }

    let alert = UIAlertController(title: "Please Enter Your Name", message: "", preferredStyle: .alert)

    alert.addTextField(configurationHandler: configurationTextField)
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler:handleCancel))
    alert.addAction(UIAlertAction(title: "Done", style: .default, handler:{ (UIAlertAction) in
        print("Done !!")

        print("Item : \(String(describing: tField.text))")
        self.nombre = tField.text!
    }))
    self.present(alert, animated: true, completion: {
        print("completion block")
    })
    print(self.nombre)
    passData()
    if tField.text == nil {
        return "No value"
    }else{
        return (tField.text!)
    }
}

func passData() {
    let myVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as! AboutViewController
    if myVC.playerName != nil {
        myVC.playerName.text = nombre
    }else{

    }
    navigationController?.pushViewController(myVC, animated: true)
    print("pasa el dato")
}

So, the Problem is, that i need to pass the content of the variable "nombre" to another VC. But when the passData function is excecuted that variable is empty. I thought if i called that function after the variable was updated, it Will pass the right content. But im clearly mistaken.

I would appreciate the help!

Upvotes: 1

Views: 62

Answers (1)

creeperspeak
creeperspeak

Reputation: 5521

In general, unless your functions are asynchronous, you are correct in your understanding that code is executed from top down. In this case I think you are just confused about your UIAlertAction code. It appears you are popping an alert to the user, asking them to write their name, and when they hit "Done" you want to call your passData() function. In that case, you should put that passData() call inside your UIAlertAction, like so:

alert.addAction(UIAlertAction(title: "Done", style: .default, handler:{ (UIAlertAction) in
    print("Done !!")

    print("Item : \(String(describing: tField.text))")
    self.nombre = tField.text!
    self.passData()
}))

The code inside the handler for your UIAlertActions will not be executed until the user presses that button, which is why you are finding that passData is getting called too early.

Upvotes: 1

Related Questions