使用Xcode 7,iOS 9运行项目时,“应用程序窗口期望在应用程序启动结束时具有根视图控制器”错误
运行后function
- (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一起运行?
从你的错误信息:
应用程序窗口预计在应用程序启动结束时具有根视图控制器
这个“老”的项目多久了? 如果超过几年,你是否还有:
[window addSubview:viewController.view];
您应该将其replace为:
[window setRootViewController:viewController];
如果您已经在您的应用程序委托中设置了self.window的rootViewController,并且在运行时仍然收到此错误,那么您的UIApplication中可能有多个窗口,其中一个窗口可能没有关联rootViewController。 你可以遍历你的应用程序窗口,并将一个空的viewController关联到它的rootViewController来解决你所得到的错误。
这里是一个代码,循环通过应用程序窗口,并关联一个空的ViewController到rootViewController,如果一个窗口是缺less它。
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开始,在application(_:didFinishLaunchingWithOptions:)
实例化的任何UIWindow
需要在离开该方法之前设置rootViewController
。
以前只有主窗口在该方法中设置rootViewController
就足够了。 现在任何UIWindow
实例都需要有一个有效的rootViewController
属性。
这里的罪魁祸首可能是你自己的代码,如果你使用UIWindow
和任何其他第三方库试图在此期间初始化一个新的UIWindow
实例(如状态栏消息覆盖等)。
注意 :如果您未在主窗口上设置rootViewControler
,或者故事板设置不正确,也会出现相同的错误。 因为这些情况是非常明显和直接解决的,所以将其作为一个侧面提及。
你应该在你的应用程序中设置每个窗口的rootviewcontroller属性
今天我也咬了我一口气,花了我几个小时的时间来修复它:我的App有一个“MainWindow.xib”的窗口,包含导航控制器和伴随的根视图控制器,它们都按照正确的顺序自动实例化,与Xcode 6和iOS8。
在iOS9上,App从AppStore下载的时候仍然可以正常运行,而不是在使用Xcode 7新build和在iOS 9上运行的时候。当应用程序委托执行它的applicationDidBecomeActive:方法时,根视图控制器现在不会被加载,因为它以前曾经是! 这使得根视图控制器错过了对我恢复状态码的调用。
我通过在代码中自己实例化根视图控制器,并明确地从viewDidLoad恢复其状态来解决这个问题。
只需将你的rootViewController设置为navigationController,这是你的UIViewController在app-delegate.rb中,就像我下面的代码。 我是新的ruby,但希望这有助于…
rootViewController = UIViewController.alloc.init @window.rootViewController = navigationController
我遇到了一个更less或更lessinheritance的应用程序。 validation故事板是否正确设置为应用程序主界面,并且故事板上有一个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修复了这个错误。
我有一个较早的项目,在iOS 8但不是iOS 9中工作。如果您的主界面设置为MainWindow.xib,将其更新为故事板。 这对我来说是固定的:
- 创build一个新的项目,单一视图应用程序是好的。
- 将Main.storyboard文件复制到您的项目,或者您可以创build自己的。
- 打开您的项目设置并将您的主界面设置为Main.storyboard
Swift 2解决scheme,为我工作:
将下面的代码插入到AppDelegate – > didFinishLaunchingWithOptions中
self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("YourRootViewController") as? YourRootViewControllerClass
- 来自Amazon S3的iOS 9应用程序下载SSL错误:TLS 1.2支持
- iOS 9中的新警告
- UIWindow endDisablingInterfaceAutorotationAnimated错误出现在控制台中时,仅在iOS9中从collectionView以交互方式解除键盘
- 如何删除应用程序在新的iTunes Connect网站build立?
- Xcode 7 – 代码覆盖率数据生成失败
- 当UISearchController处于活动状态时,iOS 9 searchBar从表头视图中消失
- 尝试加载视图控制器的视图,而它正在释放… UIAlertController
- Xcode 7.2:在“存档”中:解决问题:找不到“Cordova / CDVViewController.h”文件。 虽然在构build应用程序时没有这样的问题
- iOS 9新function免费configuration(在设备上运行您的应用程序,只需使用您的Apple ID,不需要Apple开发人员)