90

运行后功能

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

4

10 回答 10

176

从您的错误消息中:

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

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

[window addSubview:viewController.view];

您应该将其替换为:

[window setRootViewController:viewController];
于 2015-06-18T12:29:47.193 回答
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;
    }
}

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

于 2015-09-19T02:34:33.890 回答
21

XCODE 7 要求所有的 Windows 都必须有一个 rootViewController 你可以很容易地使用:

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

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

于 2015-09-17T14:48:23.627 回答
13

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

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

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

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

于 2015-11-27T13:09:26.823 回答
3

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

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

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

于 2015-10-04T15:44:53.353 回答
2

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

于 2015-09-17T03:42:53.500 回答
2

我有一个在 iOS 8 但不是 iOS 9 的旧项目。如果您的主界面设置为 MainWindow.xib,请将其更新为情节提要。这为我修复了它:

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

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

rootViewController = UIViewController.alloc.init

@window.rootViewController = navigationController
于 2015-09-22T11:10:41.283 回答
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 修复了该错误。

于 2016-05-31T18:40:20.083 回答
0

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

在 AppDelegate -> didFinishLaunchingWithOptions 中插入以下代码

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

于 2016-08-31T18:45:55.137 回答