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

Posted

技术标签:

【中文标题】使用 Xcode 7、iOS 9 运行项目时出现“应用程序窗口应在应用程序启动结束时具有根视图控制器”错误【英文标题】:"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 【发布时间】:2015-09-02 07:02:57 【问题描述】:

运行后函数

- (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 是测试版,您可能应该回到 Xcode 6 进行任何严肃的开发工作。 Applications are expected to have a root view controller at the end of application launch的可能重复 你好,我收到了这个错误:- *** 断言失败 -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/ UIKit-3505.16/UIApplication.m:3294 如何解决这个问题 【参考方案1】:

根据您的错误消息:

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

这个“旧”项目有多少年了?如果超过几年,你还有没有:

[window addSubview:viewController.view];

您应该将其替换为:

[window setRootViewController:viewController];

【讨论】:

我有同样的问题,我认为这是 iOS 9 的问题。我的项目适用于 iOS 7 和 8。出于某种原因,情节提要中的视图设置不正确。 非常感谢。答案在错误消息中:“应用程序窗口”我发现我的项目中有两个窗口,一个是普通窗口,另一个是调用的第三方模块 MTStatusBarOverlay 并且没有 RootViewController,iOS9 要求所有的 Window 都必须有 rootViewController。 是的,我最终发现了同样的问题。我的应用程序有一个没有根视图控制器的附加窗口。 我找到了适合我的解决方案:***.com/a/32719949/1881895【参考方案2】:

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

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

【讨论】:

谢谢!!这对我来说是个问题。我已经设置了主视图控制器,但该应用程序还有一个我不知道的窗口。 太扎实了...我不是新手,当更新到运行 iOS 9.1 的 Xcode 7.1 时,这个让我受益匪浅...状态栏有一个专用窗口...当然可以?!如果这对任何人都意味着什么,我会隐藏状态栏。 哇,我的 12 个应用程序中有 2 个在应用程序审查时崩溃了,这似乎可以解决它。 效果很好!!一定会喜欢“显然有一个专门用于状态栏的窗口,这通常会导致此问题。”没有看到这一点。 此方法可能会导致在您的 rootViewController 上调用两次 viewDidLoad 和 viewWillAppear。如果您有手动初始化窗口,请检查您的 plist 并确保您没有将 Window.xib 定义为“主 nib 文件基本名称”,如果您在使用此解决方法后看到两次调用的内容。然后你只需要像往常一样删除这段代码并设置RootViewController。【参考方案3】:

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

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

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

【讨论】:

欢迎来到 Stack Overflow!请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为什么会解决问题的解释。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。 谢谢,这避免了我的 iOS ~3–8 警告 => iOS 9 崩溃,但给出了关于泄漏的静态分析器警告。因此,我将声明移至标题中的接口,并在 applicationDidFinishLaunching 中分配。然后我将 [vc release] 添加到 dealloc。【参考方案4】:

似乎从 iOS 9.1(?) 或 Xcode 7.1 开始,任何UIWindowapplication(_:didFinishLaunchingWithOptions:) 需要在离开该方法之前设置 rootViewController

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

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

注意:如果您没有在主窗口中设置rootViewControler,或者您的情节提要设置不正确,您也会遇到同样的错误。将此作为附注提及,因为这些情况非常明显且易于修复。

【讨论】:

你太棒了 :D,谢谢伙计,我只是评论了窗口的初始化,现在一切正常【参考方案5】:

今天我也遇到了这个问题,我花了几个小时来修复它:我的应用程序有一个“MainWindow.xib”中的窗口,带有导航控制器和随附的根视图控制器,它们都是自动实例化的正确的顺序,使用 Xcode 6 和 iOS8。

在 iOS9 上,从 AppStore 下载的应用程序仍然可以正常运行,但在使用 Xcode 7 新建并在 iOS 9 上运行时不能。此时应用程序委托正在执行其 applicationDidBecomeActive: 方法根视图控制器现在没有加载,就像以前一样!这使得根视图控制器错过了对我的恢复状态代码的调用。

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

【讨论】:

【参考方案6】:

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

【讨论】:

你的回答对我有帮助【参考方案7】:

我有一个在 iOS 8 中运行但在 iOS 9 中运行的旧项目。如果您的主界面设置为 MainWindow.xib,请将其更新为情节提要。这为我解决了问题:

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

【讨论】:

【参考方案8】:

只需将您的 rootViewController 设置为 navigationController,它是 app-delegate.rb 中的 UIViewController,如下面的代码。我是 ruby​​ 新手,但希望这会有所帮助...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

【讨论】:

【参考方案9】:

我遇到这个问题的应用程序我继承得更多或更少。在验证故事板已正确设置为应用程序主界面并且故事板具有 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'

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

【讨论】:

【参考方案10】:

对我有用的 Swift 2 解决方案:

在 AppDelegate 中插入下面的代码 -> didFinishLaunchingWithOptions

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

【讨论】:

以上是关于使用 Xcode 7、iOS 9 运行项目时出现“应用程序窗口应在应用程序启动结束时具有根视图控制器”错误的主要内容,如果未能解决你的问题,请参考以下文章

将 StoryBoard 从 Xcode 更新到 Xcode 9 时出现 UI 问题

归档 iOS 应用程序时出现 Xcode 错误

在 localhost Xampp 中使用 PHP 7.3.9 设置正在运行的 Codeigniter 2.1.4 项目时出现问题

Splunk MINT shell 脚本问题:当我尝试在 Xcode 9.3 中存档应用程序时出现问题

带有 iOS 9 设备的 Xcode 7 错误:设备不可用(找不到开发者磁盘映像)

为啥当我尝试在 ios 7.1 sdk、xcode 5.1 中调用 deallocate 或 release 时出现错误?