"Application windows are expected to have a root view controller at the end of application launch" error when running a project with Xcode 7, iOS 9

Xcode7Ios9

Xcode7 Problem Overview


After running function

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

there is a crash:

 Assertion failure in 
-[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', `enter code here`reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
	0   CoreFoundation                      0x0000000109377885 __exceptionPreprocess + 165
	1   libobjc.A.dylib                     0x0000000108df0df1 objc_exception_throw + 48
	2   CoreFoundation                      0x00000001093776ea +[NSException raise:format:arguments:] + 106
	3   Foundation                          0x0000000108a42bb1 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
	4   UIKit                               0x000000010760e350 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2875
	5   UIKit                               0x000000010760b73f -[UIApplication workspaceDidEndTransaction:] + 188
	6   FrontBoardServices                  0x000000010b87fd7b FrontBoardServices + 163195
	7   FrontBoardServices                  0x000000010b880118 FrontBoardServices + 164120
	8   CoreFoundation                      0x00000001092a20f1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
	9   CoreFoundation                      0x0000000109297eac __CFRunLoopDoSources0 + 556
	10  CoreFoundation                      0x0000000109297363 __CFRunLoopRun + 867
	11  CoreFoundation                      0x0000000109296d78 CFRunLoopRunSpecific + 488
	12  UIKit                               0x000000010760b091 -[UIApplication _run] + 402
	13  UIKit                               0x000000010760f79b UIApplicationMain + 171
	14  bbwc                                0x00000001037a9998 main + 344
	15  libdyld.dylib                       0x000000010a45ca05 libdyld.dylib + 10757
	16  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

This project is an old project, what should I do to make it build and run with Xcode 7 and iOS 9?

Xcode7 Solutions


Solution 1 - Xcode7

From your error message:

> Application windows are expected to have a root view controller at the end of application launch

How old is this "old" project? If it's more than a few years, do you still have:

[window addSubview:viewController.view];

You should instead replace it with:

[window setRootViewController:viewController];

Solution 2 - Xcode7

If you have already set the rootViewController of your self.window in you app delegate and still getting this error at runtime, then you probably have more than one window in your UIApplication one of which may not have a rootViewController associated. You can loop through your app windows and associate an empty viewController to its rootViewController to fix the error you are getting.

Here's a code that loops through the app windows and associates an empty ViewController to the rootViewController if a window is missing it.

NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
    NSLog(@"window: %@",window.description);
    if(window.rootViewController == nil){
        UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
        window.rootViewController = vc;
    }
}

Update: Apparently there is a window dedicated to the status bar which typically causes this issue. The above code should fix this error.

Solution 3 - Xcode7

XCODE 7 requires that all the Windows must have a rootViewController You can use easy:

UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;

It's working good if you need to use only UIWindow (for easy examples from any Tutorials - before Xcode 7)!

Solution 4 - Xcode7

It seems that since iOS 9.1(?) or Xcode 7.1 any UIWindow instantiated during application(_:didFinishLaunchingWithOptions:) needs to have a rootViewController set before leaving that method.

Previously it was sufficient for only the main window to have a rootViewController set during that method. Now any UIWindow instance needs to have a valid rootViewController property.

The culprit here could be your own code if you make use of UIWindow and also any other third party library that tries to initialize a new UIWindow instance during this time (like status bar message overlays, etc.).

NOTE: You also get the same error if you don't set the rootViewControleron your main window or if your storyboard is not set up right. Mentioning this as a side note since those cases are pretty obvious and straightforward to fix.

Solution 5 - Xcode7

This has bitten me today too, and it cost me a few hours to fix it: my App has the window in a "MainWindow.xib", complete with navigation controller and accompanying root view controller, that were all automatically instantiated in the proper order, with Xcode 6 and iOS8.

On iOS9 that App still runs fine when downloaded from the AppStore, but not when newly built with Xcode 7 and run on iOS 9. At the time the app delegate is executing its applicationDidBecomeActive: method the root view controller is now not loaded, as it used to be before! That made the root view controller miss the call to my restore state code.

I fixed this by instantiating the root view controller myself, in code, and restoring its state from the viewDidLoad, explicitly.

Solution 6 - Xcode7

You should set every window's rootviewcontroller property in your app

Solution 7 - Xcode7

I have an older project that worked in iOS 8 but not iOS 9. If your Main Interface is set to MainWindow.xib, update it to a storyboard. This fixed it for me:

  1. Create a new project, Single View Application is fine.
  2. Copy the Main.storyboard file to your project, or you could just create your own.
  3. Open your Project Settings and Set your Main Interface to Main.storyboard Set your Main Interface to Main.storyboard

Solution 8 - Xcode7

Just set your rootViewController to navigationController which is your UIViewController in the app-delegate.rb like my code below. I am new in ruby but hope this helped...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

Solution 9 - Xcode7

I came into this issue with an app I more ore less inherited. After verifying that the storyboard was properly set up as the apps main interface and that the storyboard had a RootViewController I was still getting the crash.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

What I discovered after some further investigation that the crash was being caused by some view logic (SVProgressHud) being called in - (void)applicationDidBecomeActive:(UIApplication *)application. This seems to be new behavior in Xcode7 but as far as I can tell SVProgressHud was referencing the rootviewcontroller before it was set by the storyboard. Ultimately updating SVProgressHud to 2.0 fixed the bug.

Solution 10 - Xcode7

Swift 2 solution that worked for me :

Insert the code below in AppDelegate -> didFinishLaunchingWithOptions

self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionandrew wangView Question on Stackoverflow
Solution 1 - Xcode7James WebsterView Answer on Stackoverflow
Solution 2 - Xcode7Bms270View Answer on Stackoverflow
Solution 3 - Xcode7EnvoyView Answer on Stackoverflow
Solution 4 - Xcode7lipkaView Answer on Stackoverflow
Solution 5 - Xcode7RickJansenView Answer on Stackoverflow
Solution 6 - Xcode7allaView Answer on Stackoverflow
Solution 7 - Xcode7AdrianView Answer on Stackoverflow
Solution 8 - Xcode7BigPun86View Answer on Stackoverflow
Solution 9 - Xcode7BuenoView Answer on Stackoverflow
Solution 10 - Xcode7Fox5150View Answer on Stackoverflow