Set rootViewController of UINavigationController by method other than initWithRootViewController
You can solve this by calling setViewControllers
.
Like this:
UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:[UIToolbar class]];[navigationController setViewControllers:@[yourRootViewController] animated:NO];
Swift version:
let navigationController = UINavigationController(navigationBarClass: MyNavigationBar.self, toolbarClass: UIToolbar.self)navigationController.setViewControllers([yourRootViewController], animated: false)
Knowledge Sharing Using Swift:
Changing root view controller from class other than app delegate.swift
let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegatelet mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewControllerlet nav = UINavigationController(rootViewController: homeViewController)appdelegate.window!.rootViewController = nav
Hope this will helpful for someone.
Edited:
Changing rootviewcontroller With Animation can be achieve with:
UIView.transitionWithView(self.window!, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: { self.window?.rootViewController = anyViewController}, completion: nil)
We can write generalise method too similar to this.
this one works for me, hope it helps you,
let rootVC:LoginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewControllerlet nvc:UINavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("RootNavigationController") as! UINavigationControllernvc.viewControllers = [rootVC]UIApplication.sharedApplication().keyWindow?.rootViewController = nvc