How many times have you wanted to set an initial view controller in the storyboard conditionally? For example, when building an app that allows user to sign in, you would like to open the login controller the first time, but go right to the authenticated screens everytime the user opens the app in the future. You could do it by creating a dummy initial view controller in the storyboard that just imitates the splash screen and then decide where to go from there. This tutorial explains a way of getting it to work without setting up a dummy controller.
Without any initial view controller in Storyboard
Ensure all controllers that you want as initial view controllers have a Storyboard ID.
In the storyboard, uncheck the Is initial View Controller
attribute from the first view controller (or delete the small arrow pointing to your first view controller).
If you run your app at this point you’ll read:
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main.Storyboard' - perhaps the designated entry point is not set?
In the app’s setting, go to your target and the Info tab. Clear the value of Main storyboard file base name
. On the General
tab, clear the value for Main Interface
. This will remove the warning.
Create the window and desired initial view controller in the app delegate’s application:didFinishLaunchingWithOptions:
method:
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
if ([self isUserLoggedIn]) {
// Show the dashboard
self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"SDDashboardViewController"];
} else {
// Login
self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"SDLoginViewController"];
}
[self.window makeKeyAndVisible];
With UINavigationController as the initial view controller in storyboard
If all your controllers have a navigation bar (or you are willing to manage navigation bar visibility logic in the controllers), an alternative (and a much easier) way to set the initial view controller conditionally is by using a UINavigationController
as the initial view controller in the storyboard.
Set up your storyboard with a UINavigationController
as the initial view controller and create your initial view controllers with Storyboard ID
s but without any link form the UINavigationController
.
Now, somewhere in your delegate’s application:didFinishLaunchingWithOptions:
method, instantiate the proper view controller and push it to the navigation controller.
var navigationController: UINavigationController? = (self.window?.rootViewController as? UINavigationController)
var storyboard = UIStoryboard(name: "Main", bundle: nil)
if self.isUserLoggedIn() {
// Show the dashboard
navigationController?.pushViewController(storyboard.instantiateViewController(withIdentifier: "SDDashboardViewController"), animated: false)
}
else {
// Login
navigationController?.pushViewController(storyboard.instantiateViewController(withIdentifier: "SDLoginViewController"), animated: false)
}