使用XCode7测试版4将项目更新为iOS9



我刚试着用新的XCode7测试版4运行我的项目,但在运行模拟器后立即出现了这个异常:

Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:],/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3491.2.5/UIApplication.m:3173 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'

我读到设置主窗口的rootViewVontroller可能有问题,但我在AppDelegate.m文件中的代码是这样的:

[self.tabBarController setViewControllers:tabViewControllers];
[self.tabBarController setCustomizableViewControllers:customizableControllers];
[self.window setRootViewController:self.tabBarController];

其中tabBarController类是自定义UITabViewController。我的项目中没有使用任何.xib文件!有人知道我该怎么做吗?

提前感谢

Xcode 7.0中出现问题。解决方案是在main.m文件中替换此代码

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

几乎所有东西都有同样的问题,PowerVR的示例代码,有时甚至是苹果的示例代码。

我相信这是iOS 9的问题(在这一点上,9似乎很严格(。为了符合iOS 9,必须在应用程序启动完成之前的某个时刻调用setRootViewController。

为了继续,尤其是使用旧代码,我下载了iOS 8.4和iOS 8.1模拟器。以完全相同的代码为目标会产生一个正常运行的项目,就像旧的Xcode构建一样。

设备也会出现类似的结果;针对iOS 9之前版本的操作系统上的设备会导致正常操作(尽管控制台确实显示了对根视图控制器的投诉(说应用程序Windows应该有一个根视图控制器((,但该应用程序会运行。

这似乎是一些不受欢迎的设计要求——在没有根视图控制器的情况下运行代码的"允许"似乎在早期版本中受到了警告,但从iOS 9开始,这似乎是正式要求的。

有些代码没有这样的规定,因此,例如,在SDK 3.5的PowerVR示例代码中(相当新,是2015年9月12日的最高版本(,必须创建某种视图控制器(他们的代码似乎没有(。

在[self.window-makeKeyAndVisible]之后设置self.window.rootController可能会解决此问题。

这对我有效

首先,尝试正常步骤以确保一致性:

  • 清理项目
  • 清除您正在使用的模拟器中的任何数据

接下来,问自己以下问题:

  1. 它在以前版本的Xcode中成功运行了吗
  2. 除了为新的Xcode进行必要的转换之外,您是否更改了其他内容?(使用版本控制差异(
  3. 是否已处理(或至少已理解(所有警告?(我会确保所有问题都得到解决(
  4. 您的目标SDK/设备是否已更改?(针对以前的iOS版本再试一次,看看是否能修复它(

使用版本控制系统的diff功能可以帮助解决问题1和4。这可以帮助检测无意的更改,例如接口构建器元素的打字错误或删除。

警告是相关的,因为可能存在未通知您的SDK更改。确保您仍然以相同的SDK为目标可以减少这方面的不确定性。

可能导致此类错误的一些更改包括:

  • 移动或重命名文件
  • 重命名类
  • 情节提要的更改(例如,"条目"错误被错误删除,添加了您没有意识到的额外视图,其他"胖手指"错误(
  • 有点错误的代码或针对旧的SDK的代码,现在在新操作系统中是致命的
  • 没有UIApplicationMain最后一个参数的旧代码(请参阅应用程序在应用程序启动结束时应该有一个根视图控制器,或者(正如您所指出的(需要设置根视图控制器而不是使用addSubview:在使用Xcode 7运行项目时,iOS 9

最新更新