Naresh
Naresh

Reputation: 17932

Warning: Attempt to present <UIAlertController:> on <App name:> whose view is not in the window hierarchy

I'm getting this error because of I'm presenting alert in another VC, but how to solve this.

My code is :

{
     let message = res[0]["message"] as! String
     //If session expaired move to login page
     if message == "Session Expired" {
         //Session Expired
         DispatchQueue.main.async {
             //Remove all navigations
             self.navigationController?.viewControllers.removeAll()
             //Check whether the user logined or not
             UserDefaults.standard.set(false, forKey: "isUserLoggedIn")
             //Clear user defaults
             SharedClass.sharedInstance.clearDataFromUserDefaults()

             let lvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LVC") as! LoginViewController
             let appDelegate = UIApplication.shared.delegate as! AppDelegate
             appDelegate.window?.rootViewController = lvc
         }
     }
     //Call alert function
     self.showAlert(title: "", msg: message)
 }

Alert function :

//Alert function
extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }
}

How to present alert properly in my case....

Upvotes: 1

Views: 124

Answers (2)

m1sh0
m1sh0

Reputation: 2361

Just use

self.navigationController?.popToRootViewController(animated: false)

or

 self.navigationController?.setViewControllers([LoginViewController], animated: true)

instead of

self.navigationController?.viewControllers.removeAll()

Upvotes: 1

Kamran
Kamran

Reputation: 15258

Try presenting alertController on rootViewController as,

extension UIViewController {
    func showAlert(title: String, msg: String) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
    }
}

The viewController you are calling showAlert method on is not currently presented viewController in the view hierarchy so either you should get the latest presented viewController in the view hierarchy or try presenting on the rootViewController.

You can check this to get the currently presented viewController.

Upvotes: 1

Related Questions