Home > Software engineering >  Pushnavigation is not working with custom alert in swift
Pushnavigation is not working with custom alert in swift

Time:02-16

I am using my custom alert to log out of the application

in custom alert, I have tried to log out with firebase after the successful logout using navigation push controller to sign in the controller but it will not redirect to sign in screen

Here is my custom alert code

let customAlert = self.storyboard?.instantiateViewController(withIdentifier: "CustomAlertID") as! AlertViewController
        customAlert.titleLbl = "Log out"
        customAlert.imageTitle = "logout"
        customAlert.descryptionText = "You will be returned to the login screen. Are you sure you want to logout?"
        customAlert.okBtnText = "LOG OUT"

        DispatchQueue.main.async {
            customAlert.providesPresentationContextTransitionStyle = true
            customAlert.definesPresentationContext = true
            customAlert.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
            customAlert.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
            self.present(customAlert, animated: true, completion: nil)
        }

Here is my logout click button code

 let firebaseAuth = Auth.auth()
          do {
            try firebaseAuth.signOut()
              let controller = self.storyboard?.instantiateViewController(withIdentifier: "SignInViewController") as! SignInViewController
              self.navigationController?.pushViewController(controller, animated: true)

              DispatchQueue.main.asyncAfter(deadline: .now()   0.5) {
                  self.navigationController?.popToRootViewController(animated: true)
              }

              let domain = Bundle.main.bundleIdentifier!
              UserDefaults.standard.removePersistentDomain(forName: domain)
              UserDefaults.standard.synchronize()
              print(Array(UserDefaults.standard.dictionaryRepresentation().keys).count)
          } catch let signOutError as NSError {
              self.dismiss(animated: true, completion: nil)
            print("Error signing out: %@", signOutError)
          }
        }

without the alert view, it will works

CodePudding user response:

In order for the navigationController property to not be equal to nil, you must add your custom alertViewController to the navigation stack using pushViewController method. In your case, you are only presenting a custom alertViewController that does not know anything about your navigationController

There is another way to implement:

After initializing a custom view controller, you should pass it the necessary closure functions that should work after pressing the button

Example:

let customAlert = self.storyboard?.instantiateViewController(withIdentifier: "CustomAlertID") as! AlertViewController
        customAlert.titleLbl = "Log out"
        customAlert.imageTitle = "logout"
        customAlert.onClickExit = { [weak self] in
            self?.navigationController?.popViewController(animated: true)
        }
...

CodePudding user response:

After Logout, you should set Another Root view controller and Your navigationController Stack Must be Clear.

let controller = self.storyboard?.instantiateViewController(withIdentifier: "SignInViewController") as! SignInViewController
let signInNavController = UINavigaionController(rootViewController: controller)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = signInNavController
  • Related