Search code examples
iosswiftxcodefirebasesegue

How to pass textfield.text data through 2 view controllers


I am trying to pass the two textfields (passName and passPhone) after the user enters them both in the ViewController as textField.text to my 3rd view controller as I need it to ref a firebase database child name, but every time I run it gives me a nil return value? I don't understand why the value doesn't pass

the performSegue should be passing the textfield.text to the next view controller because in override func prepare i set it so

Error code: (look in code for location)

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

// ViewController

@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var numberField: UITextField!
@IBAction func linkTapped(_ sender: Any) {
    if (nameField.text != nil && numberField.text != nil) {
         if error != nil {
                   //code
                } else {
                    self.performSegue(withIdentifier: "code", sender: self) 
                }
            }
        }

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = verificationCodeViewController()
    vc.passName = self.nameField.text
    vc.passPhone = self.numberField.text
    nameField.endEditing(true)
    numberField.endEditing(true)
}

// verificationCodeViewController

var passName: String!
var passPhone: String!

@IBAction func Login(_ sender: Any) {
    if (code.text! != "") {
        let defaults = UserDefaults.standard
        let credential: PhoneAuthCredential = PhoneAuthProvider.provider().credential(withVerificationID: defaults.string(forKey: "authVID")!, verificationCode: code.text!)
        Auth.auth().signIn(with: credential) { (user, error) in
            if error != nil {
                print("error: \(String(describing: error?.localizedDescription))")
            } else {
                print("Phone Number: \(String(describing: user?.user.phoneNumber))")
                let userInfo = user?.user.providerData[0]
                print("Provider ID: \(String(describing: userInfo?.providerID))")
                self.performSegue(withIdentifier: "logged", sender: Any?.self)
            }
        }
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = RankedClubScreen()
    vc.passName = self.passName
    vc.passPhone = self.passPhone
}

// RankedClubScreen -- ViewController

var passName: String!
var passPhone: String!

@IBAction func signOutFunction(_ sender: Any) {
    do {
        try Auth.auth().signOut()
        let ref = Database.database().reference().child("Online Users")
        print(self.passName + self.passPhone) // Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
        ref.child(self.passName + self.passPhone).removeValue()

        self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
    } catch let error {
        print("not signed in...", error)
    }
}

Solution

  • Your problem is creating a new vc and not using the segue destination here

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      let vc = VerificationCodeViewController()
    

    and here

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let vc = RankedClubScreen()
    

    so let it be written

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      let vc = segue.destination as! VerificationCodeViewController
      vc.//// set this 
    

    let it be done also for the other segue


    enter image description here