If i logout and login then unable to login for the first time, why? in swift

564 Views Asked by At

my app flow like below

  uinavigationcontroller(is initial viewcontroller) -> loginVC -> homeVC
                                                          

enter image description here

i am having SceneDelegate in project, so trying code like below

SceneDelegate code:

  func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            let userLoginStatus = UserDefaults.standard.bool(forKey: "USER_LOGIN")
              if (userLoginStatus) {
                let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc_TabBar = mainStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
                window!.rootViewController = vc_TabBar
                window!.makeKeyAndVisible()
            }
    guard let _ = (scene as? UIWindowScene) else { return }
}

loginVC code:

 @IBAction func loginBtnTapped(_ sender: Any) {
    
    guard  let email = emailTF.text,
           let password = passwordTF.text
    else {
        print("form is not valis")
        return
    }
  //  UserDefaults.standard.set(true, forKey: "USER_LOGIN")

    Auth.auth().signIn(withEmail: email, password: password) { (result, error) in
                if let _eror = error{
                    print(_eror.localizedDescription)
                }else{

                    if let _res = result{
                        print(_res)
                        UserDefaults.standard.set(true, forKey: "USER_LOGIN")

          
                        let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "HomeViewController") as? HomeViewController
                        self.navigationController?.pushViewController(vc!, animated: true)
                    }
                }
            }
   }

homveVC logoutButton code:

  @IBAction func logoutBtnTapped(_ sender: Any) {
    UserDefaults.standard.set(false, forKey: "USER_LOGIN") //logging session off

    do{
        try Auth.auth().signOut()
    }catch let logoutError{
        print(logoutError)
    }
  //  UserDefaults.standard.set(false, forKey: "USER_LOGIN") //logging session off

    let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "SignInViewController") as? SignInViewController
    self.navigationController?.pushViewController(vc!, animated: true)
    
}

with the above code i am able to auto login, but once i logout and if i login then its not going to homeVC.. if i stop and run then showing homeVC why, where am i wrong.. pls do help.

1

There are 1 best solutions below

3
On BEST ANSWER

I would change the login as follow:

remove everything in your SceneDelegate:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {        
   guard let _ = (scene as? UIWindowScene) else { return }
}

in your SignInViewController change has follow:

override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    userIsloggedin()
}

func userIsloggedin(){
    let userLoginStatus = UserDefaults.standard.bool(forKey: "USER_LOGIN")
    if (userLoginStatus) {
        self.performSegue(withIdentifier: "toHomeVC", sender: self)
    }
}

@IBAction func loginBtnTapped(_ sender: UIButton) {
    UserDefaults.standard.set(true, forKey: "USER_LOGIN")
    self.performSegue(withIdentifier: "toHomeVC", sender: self)
}

create a segue in your storyboard named "toHomeVC". Your storyboard should look like this:

enter image description here

enter image description here

and then change your code in HomeViewController

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true //to hide the back button 
}

@IBAction func logoutBtnTapped(_ sender: UIButton) {
      UserDefaults.standard.set(false, forKey: "USER_LOGIN") //logging session off
    self.navigationController?.popToRootViewController(animated: true) // or false if you don't want to see the animation
}

Lastly, if you need yo use UITabarController just embed your HomeVc like so:

enter image description here

and you Storyboard should look like this:

enter image description here

If you decide to embed it the UITabBarController you must hide the back button like so:

self.tabBarController?.navigationItem.hidesBackButton = true