Search code examples
iosswiftcosmicmind

SideNavigationController - Replace rootViewController of NavigationController


I'm using the Material Framework by CosmicMind. Currently I'm trying to replace the ViewController once a row is selected in the SideNavigationController. Unfortunately I can't figure out how to do this. There're similar question here on StackOverflow (#1) unfortunately the solutions don't work for me.

Following my code in the AppDelegate.swift class:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let myViewController = storyboard.instantiateViewControllerWithIdentifier("MyViewController")

    let navigationController: NavigationController = AppNavigationController(rootViewController: myViewController)

    let sideNavigationController: SideNavigationController = SideNavigationController(rootViewController: navigationController, leftViewController: AppLeftViewController())

    // further code

    return true
}

With this code everything works fine. The ViewController (MyViewController) is shown.
Now I'm trying to replace the MyViewController with MySecondViewController however this doesn't work. Following the code I've been using:

sideNavigationController?.transitionFromRootViewController(MySecondViewController())

The result is that the Toolbar disappears and I can't close the SideNavigationController anymore. So I've tried the following:

let navigationController: NavigationController = AppNavigationController(rootViewController: MySecondViewController())
sideNavigationController?.transitionFromRootViewController(navigationController)

With this code the Toolbar is visible once again but the problem with the SideNavigationController remains -> means: It can't be closed.

tl;dr
How do I replace the rootViewController of the NavigationController properly?


Solution

  • The NavigationController is a subclass of UINavigationController. So changing the rootViewController is as iOS made it. For example:

    navigationController?.pushViewController(MySecondViewController(), animated: true)
    

    The SideNavigationController offers the ability to transition its rootViewController. This is different, as the SideNavigationController uses child UIViewControllers and swaps them when asked. For example:

    sideNavigationController?.transitionFromRootViewController(MySecondViewController())
    

    Sometimes, people use the sideNavigationController to early. For example, you instantiate a new UIViewController, and place the sideNavigationController code in the videDidLoad method. This won't work since the new UIViewController was not yet added to the sideNavigationController view hierarchy. To solve this, use the viewWillAppear method.

    The last situation to consider is when you want to load a new UIViewController in the rootViewController of the NavigationController from the sideNavigationController. In order to do this, and let's consider that the sideNavigationController's rootViewController is the NavigationController, you would need to do this:

    (sideNavigationController?.rootViewController as? NavigationController)?.pushViewController(MySecondViewController(), animated: true)
    

    This should help you out :)