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

时间:2015-06-17 07:24:56

标签: xcode7 ios9

运行功能后

- (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一起构建和运行?

9 个答案:

答案 0 :(得分:165)

从错误消息中:

  

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

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

[window addSubview:viewController.view];

您应该将其替换为:

[window setRootViewController:viewController];

答案 1 :(得分:21)

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

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

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

答案 2 :(得分:13)

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

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

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

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

答案 3 :(得分:3)

今天也让我感到困惑,我花了几个小时来修复它:我的应用程序在一个" MainWindow.xib"中有一个窗口,配有导航控制器和附带的根视图控制器,使用Xcode 6和iOS8以正确的顺序自动实例化。

在iOS9上,App从AppStore下载时仍可正常运行,但在使用Xcode 7新构建并在iOS 9上运行时不是。当app appate正在执行applicationDidBecomeActive时:方法根视图控制器现在加载,就像以前一样!这使得根视图控制器错过了对我的恢复状态代码的调用。

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

将rootViewController设置为navigationController,它是app-delegate.rb中的UIViewController,就像下面的代码一样。我是红宝石的新手,但希望这有帮助...

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController

答案 6 :(得分: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'

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

答案 7 :(得分:0)

我有一个较旧的项目,可以在iOS 8中运行,但不适用于iOS 9.如果您的主界面设置为MainWindow.xib,请将其更新为故事板。这为我解决了这个问题:

  1. 创建一个新项目,Single View Application很好。
  2. 将Main.storyboard文件复制到您的项目中,或者您可以创建自己的文件。
  3. 打开项目设置并将主界面设置为Main.storyboard Set your Main Interface to Main.storyboard

答案 8 :(得分:0)

Swift 2 solution that worked for me :

Insert the code below in AppDelegate -> didFinishLaunchingWithOptions

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