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

跑后功能


- (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

)

libc++abi.dylib: terminating with uncaught exception of type NSException

该项目是一个旧项目,我该怎么做才能使其在Xcode 7和iOS 9中构建并运行?


慕田峪4524236
浏览 716回答 4
4回答

杨魅力

如果您已经在应用程序委托中设置了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;    }}更新:显然有一个专门用于状态栏的窗口,通常会导致此问题。上面的代码应解决此错误。

墨色风雨

XCODE 7要求所有Windows必须具有rootViewController您可以使用easy:UIViewController* vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];self.window.rootViewController = vc;如果您只需要使用UIWindow(对于任何教程的简单示例-Xcode 7之前的版本),则效果很好!

莫回无

从iOS 9.1(?)或Xcode 7.1 开始,在离开该方法之前,任何UIWindow实例化的实例都 application(_:didFinishLaunchingWithOptions:)需要具有一个rootViewControllerset。以前,rootViewController在该方法期间仅主窗口具有一个集就足够了。现在,任何UIWindow实例都需要具有有效的rootViewController属性。如果您使用此代码UIWindow以及UIWindow在此期间尝试初始化新实例的任何其他第三方库(例如状态栏消息覆盖等),则可能是您自己的代码。注意:如果未rootViewControler在主窗口中设置或情节提要板设置不正确,也会收到相同的错误。提及这一点作为旁注,因为这些案例非常明显且易于解决。
打开App,查看更多内容
随时随地看视频慕课网APP