使用Xcode 7,iOS 9运行项目时,“应用程序窗口期望在应用程序启动结束时具有根视图控制器”错误

运行后function

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

有一个崩溃:

  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 

这个项目是一个旧的项目,我该怎么做才能使它与Xcode 7和iOS 9一起运行?

从你的错误信息:

应用程序窗口预计在应用程序启动结束时具有根视图控制器

这个“老”的项目多久了? 如果超过几年,你是否还有:

 [window addSubview:viewController.view]; 

您应该将其replace为:

 [window setRootViewController:viewController]; 

如果您已经在您的应用程序委托中设置了self.window的rootViewController,并且在运行时仍然收到此错误,那么您的UIApplication中可能有多个窗口,其中一个窗口可能没有关联rootViewController。 你可以遍历你的应用程序窗口,并将一个空的viewController关联到它的rootViewController来解决你所得到的错误。

这里是一个代码,循环通过应用程序窗口,并关联一个空的ViewController到rootViewController,如果一个窗口是缺less它。

 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; } } 

更新:显然有一个窗口专用于状态栏,这通常会导致此问题。 上面的代码应该修复这个错误。

XCODE 7要求所有的Windows必须有一个rootViewController你可以使用easy:

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

如果您只需要使用UIWindow(在Xcode 7之前的任何教程中提供简单的示例),它就会运行良好!

看起来,从iOS 9.1(?)或Xcode 7.1开始,在application(_:didFinishLaunchingWithOptions:)实例化的任何UIWindow需要在离开该方法之前设置rootViewController

以前只有主窗口在该方法中设置rootViewController就足够了。 现在任何UIWindow实例都需要有一个有效的rootViewController属性。

这里的罪魁祸首可能是你自己的代码,如果你使用UIWindow和任何其他第三方库试图在此期间初始化一个新的UIWindow实例(如状态栏消息覆盖等)。

注意 :如果您未在主窗口上设置rootViewControler ,或者故事板设置不正确,也会出现相同的错误。 因为这些情况是非常明显和直接解决的,所以将其作为一个侧面提及。

你应该在你的应用程序中设置每个窗口的rootviewcontroller属性

今天我也咬了我一口气,花了我几个小时的时间来修复它:我的App有一个“MainWindow.xib”的窗口,包含导航控制器和伴随的根视图控制器,它们都按照正确的顺序自动实例化,与Xcode 6和iOS8。

在iOS9上,App从AppStore下载的时候仍然可以正常运行,而不是在使用Xcode 7新build和在iOS 9上运行的时候。当应用程序委托执行它的applicationDidBecomeActive:方法时,根视图控制器现在不会被加载,因为它以前曾经是! 这使得根视图控制器错过了对我恢复状态码的调用。

我通过在代码中自己实例化根视图控制器,并明确地从viewDidLoad恢复其状态来解决这个问题。

只需将你的rootViewController设置为navigationController,这是你的UIViewController在app-delegate.rb中,就像我下面的代码。 我是新的ruby,但希望这有助于…

 rootViewController = UIViewController.alloc.init @window.rootViewController = navigationController 

我遇到了一个更less或更lessinheritance的应用程序。 validation故事板是否正确设置为应用程序主界面,并且故事板上有一个RootViewController后,我仍然收到崩溃。

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

我经过一些进一步的调查发现,崩溃是由一些视图逻辑(SVProgressHud)在- (void)applicationDidBecomeActive:(UIApplication *)application调用引起的。 这似乎是Xcode7中的新行为,但据我所知,SVProgressHud在故事板设置之前引用了rootviewcontroller。 最终将SVProgressHud更新为2.0修复了这个错误。

我有一个较早的项目,在iOS 8但不是iOS 9中工作。如果您的主界面设置为MainWindow.xib,将其更新为故事板。 这对我来说是固定的:

  1. 创build一个新的项目,单一视图应用程序是好的。
  2. 将Main.storyboard文件复制到您的项目,或者您可以创build自己的。
  3. 打开您的项目设置并将您的主界面设置为Main.storyboard 将您的主界面设置为Main.storyboard

Swift 2解决scheme,为我工作:

将下面的代码插入到AppDelegate – > didFinishLaunchingWithOptions中

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