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

and*_*ang 84 ios9 xcode7

运行功能后

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Run Code Online (Sandbox Code Playgroud)

发生了崩溃:

 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
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*ter 169

从您的错误消息:

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

这个"旧"项目多大了?如果超过几年,你还有:

[window addSubview:viewController.view];
Run Code Online (Sandbox Code Playgroud)

您应该将其替换为:

[window setRootViewController:viewController];
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你 .答案是在错误信息中:"应用程序窗口"我发现我的项目中有两个窗口,一个是正常的widdow,另一个是第三方模块调用 (3认同)
  • MTStatusBarOverlay并没有RootViewController,iOS9要求所有Window必须有一个rootViewController. (2认同)

Bms*_*270 36

如果您已经在app appate中设置了self.window的rootViewController,并且仍然在运行时遇到此错误,那么您的UIApplication中可能有多个窗口,其中一个窗口可能没有关联的rootViewController.您可以遍历应用程序窗口并将空viewController与其rootViewController相关联,以修复您获得的错误.

这是一个循环应用程序窗口并将空ViewController与rootViewController关联的代码(如果窗口缺少它).

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!!这对我来说是个问题.我设置了主视图控制器,但应用程序有一个我不知道的第二个窗口. (2认同)

Env*_*voy 21

XCODE 7要求所有Windows必须具有rootViewController您可以轻松使用:

UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = vc;
Run Code Online (Sandbox Code Playgroud)

如果您只需要使用UIWindow(在Xcode 7之前的任何教程中的简单示例),它的工作效果很好!


lip*_*pka 13

似乎从iOS 9.1(?)或Xcode 7.1开始,任何UIWindow实例化都 application(_:didFinishLaunchingWithOptions:)需要rootViewController在离开该方法之前有一个集合.

以前只有主窗口才能rootViewController在该方法中拥有一个集合.现在任何UIWindow实例都需要有一个有效的rootViewController属性.

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

注意:如果未rootViewControler在主窗口上设置或故事板设置不正确,也会出现相同的错误.提到这是一个侧面说明,因为这些案例非常明显且易于修复.