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


89

跑后功能

- (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中构建并运行?


由于Xcode 7是Beta版,因此您可能应该回到Xcode 6进行任何认真的开发工作。
Paul R


你好,我得到这个错误:-***-[UIApplication _runWithMainScene:transitionContext:completion:],/ BuildRoot / Library / Caches / com.apple.xbs / Sources / UIKit_Sim / UIKit-3505.16 / UIApplication.m中的断言失败: 3294如何解决此问题
Akash Raghani 2015年

Answers:


175

从您的错误消息中:

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

这个“旧”项目几岁了?如果超过了几年,您是否还有:

[window addSubview:viewController.view];

您应该改为:

[window setRootViewController:viewController];

1
我有同样的问题,我认为这是iOS 9问题。我的项目可在iOS 7和8中运行。由于某些原因,情节提要中的视图设置不正确。
David Snabel-Caunt

3
非常感谢你 。答案在错误消息中:“应用程序窗口”我发现我的项目中有两个窗口,一个是正常的寡妇,另一个是名为“ Andrew
wang”的

3
MTStatusBarOverlay并且它没有RootViewController,iOS9要求所有Window必须具有rootViewController。
andrew wang 2015年

1
是的,最终我发现了同样的问题。我的应用程序还有一个没有根视图控制器的附加窗口。
David Snabel-Caunt

1
我找到了适合我的解决方案:stackoverflow.com/a/32719949/1881895
barrast

37

如果您已经在应用程序委托中设置了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;
    }
}

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


2
谢谢!!原来这是我的问题。我已经设置了主视图控制器,但是该应用程序有一个我不知道的第二个窗口。
n13

太棒了...我不是菜鸟,当更新到运行iOS 9.1的Xcode 7.1时,这让我明白了...状态栏有一个专用的窗口...当然可以吗?!如果这对任何人都有意义,我将隐藏状态栏。
whyoz 2015年

哇,我的应用程序中有12个崩溃了2个,需要进行应用程序审查,这似乎可以解决问题。
安德鲁·史密斯

很棒!!一定要爱“显然有一个专门用于状态栏的窗口,通常会导致此问题。”没有看到即将到来的消息。
eGanges

1
此方法可能会导致在rootViewController上两次调用viewDidLoad和viewWillAppear。如果您有一个手动启动的窗口,请检查您的plist并确保不要将Window.xib定义为“ Main nib file base name”(如果使用此替代方法后,您两次看到被调用的东西)。然后,您只需像平常一样删除此代码和setRootViewController。
Whyo​​z '16

21

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

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

如果只需要使用UIWindow(对于任何教程的简单示例-Xcode 7之前的版本),则效果很好!


欢迎使用Stack Overflow!请考虑编辑您的帖子,以添加更多有关代码功能以及为什么它可以解决问题的解释。通常仅包含代码(即使它可以正常工作)的答案通常不会帮助OP理解他们的问题。
SuperBiasedMan

谢谢,这避免了我的iOS〜3-8警告=> iOS 9崩溃,但是给了静态分析器关于泄漏的警告。因此,我将声明移至标头中的接口,并在applicationDidFinishLaunching中进行了分配。然后,我将[vc release]添加到了dealloc。
Flash Sheridan'2

13

从iOS 9.1(?)或Xcode 7.1 开始,在离开该方法之前,任何UIWindow实例化的实例都 application(_:didFinishLaunchingWithOptions:)需要具有一个rootViewControllerset。

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

如果您使用此代码,那么罪魁祸首可能是您自己的代码UIWindow,还有UIWindow在此期间尝试初始化新实例的任何其他第三方库(例如状态栏消息覆盖等)。

注意:如果未rootViewControler在主窗口中设置或情节提要板设置不正确,也会收到相同的错误。提及这一点作为旁注,因为这些案例非常明显且易于解决。


您太聪明了:D,谢谢我,我只是评论window的初始化,现在一切都OK
Mohammad alabid

3

今天,这也困扰着我,并且花费了几个小时来修复它:我的应用程序将窗口包含在“ MainWindow.xib”中,并带有导航控制器和随附的根视图控制器,它们均以正确的顺序自动实例化,以及Xcode 6和iOS8。

在iOS9从AppStore上下载的时候,但应用程序仍运行正常在重新在Xcode内置7和iOS 9.运行在应用程序委托执行其applicationDidBecomeActive:中时间:方法现在根视图控制器加载,因为它曾经是以前!这使得根视图控制器错过了对我的还原状态代码的调用。

我通过自己在代码中实例化根视图控制器,并从viewDidLoad显式还原其状态来解决此问题。


2

您应该在应用中设置每个窗口的rootviewcontroller属性


您的回答对我
有所

2

我有一个较旧的项目可以在iOS 8中运行,但不能在iOS 9中运行。如果您的Main Interface设置为MainWindow.xib,请将其更新为情节提要。这为我解决了:

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

1

只需将您的rootViewController设置为navigationController,即app-delegate.rb中的UIViewController,如下所示。我是红宝石的新手,但希望对您有所帮助...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

1

我遇到了一个我所继承的应用程序较少的应用程序。在验证了情节提要是否已正确设置为应用程序的主界面并且情节提要具有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,修复了该错误。


0

适用于我的Swift 2解决方案:

将以下代码插入AppDelegate-> didFinishLaunchingWithOptions

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.