Search code examples
iosswiftsegueuistoryboardsegue

How to programmatically segue after successful authentication with Firebase?


I'm just starting to code with Swift and I need help! I have authentication with firebase with email, I would like that after this login to show another view controller, I'm confused because I don't know how can I use the prepare to segue in this case. Where I need to add and how.

Thanks

My code is here.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let lvc = storyboard?.instantiateViewController(withIdentifier: "homeViewController") as? homeViewController
    self.navigationController?.pushViewController(lvc!, animated: true)
    
}

@objc private func didTapButton() {
    print("Continue Button Password")
    guard let email = emailField.text, !email.isEmpty,
          let password = passwordField.text, !password.isEmpty else {
        print("Missing field data")
        return
    }
    
    
    FirebaseAuth.Auth.auth().signIn(withEmail: email, password: password, completion: { [weak self] result, error in
        guard let strongSelf = self else {
            return
        }
        
        //            guard error == nil else {
        //                //show account creation
        //                strongSelf.showCreateAccount(email: email, password: password)
        //                return
        //            }
        print("You have signed in")
        strongSelf.label.isHidden = true
        strongSelf.emailField.isHidden = true
        strongSelf.passwordField.isHidden = true
        strongSelf.Button.isHidden = true
        
        strongSelf.emailField.resignFirstResponder()
        strongSelf.passwordField.resignFirstResponder()
        
    })
}

Solution

  • The prepare(for:sender:) is not correct. That method is for passing data to the segue.destination view controller, not for initiating a push or whatever. E.g., if your destination view controller was a FooViewController and you wanted to set the bar property in order to pass some data from the current view controller to FooViewController, you would:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? FooViewController {
            destination.bar = ...
        }
    }
    

    But if you don't need to pass any data to the destination view controller, then no prepare(for:sender:) is needed.


    In answer to the titular question, if your storyboard has a segue, give that segue an identifier, and then to initiate it programmatically, you would do:

    storyboard?.performSegue(withIdentifier: "xxx", sender: self)