iosswiftviewcontrollerrootviewpopviewcontroller

How to go back to the initial ViewController the right way?


I have a few view controllers with navigation bar and tab bar. Then I have an initial view controller with no navigation bar and tab bar. I want to go back to the initial view controller with no other view controllers in stack. Here's what I do:

// Head back to Initial View Controller.
let initialViewController = self.storyboard!.instantiateViewController(withIdentifier: "Initial")
UIApplication.shared.keyWindow?.rootViewController = initialViewController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = initialViewController

This works perfectly. But then it doesn't move to another view controller from the initial view controller again. For example:

@IBAction func loginButton(_ sender: Any) {
    print("Login Button Tapped.")

    let storyboard = UIStoryboard(name: "SignInViewController", bundle: nil)
    let signInViewController = storyboard.instantiateViewController(withIdentifier: "SignInViewController") as! SignInViewController
    self.navigationController?.show(signInViewController, sender: nil)

}

Here, the print statement is run, but self.navigationController.show won't. How do all this work? And what's the right approach to accomplish this?

EDIT:

enter image description here

To avoid any confusion, here's my storyboard. The left most viewcontroller (pink screen) is the initial view controller I want to go back to. The right most on the same level is the view where I want to go back from.


Solution

  • It doesn't move to another view controller, because you are setting a simple view controller in your rootViewController.

    What you need is:

    let initialViewController = self.storyboard!.instantiateViewController(withIdentifier: "Initial")
    let navController = UINavigationController.init(rootViewController: initialViewController)
    
    UIApplication.shared.keyWindow?.rootViewController?.present(navController, animated: true, completion: nil)
    

    This will create a navigationviewcontroller, so when on "Initial" you should be able to perform push, present actions of another view controllers.