使用 XCode7 beta 4 将项目更新为 iOS9
Update project to iOS9 with XCode7 beta 4
我刚刚尝试使用新的 XCode7 beta4 运行 我的项目,但是在 运行 启动模拟器后立即给我这个异常:
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'
我读到设置主 window 的 rootViewVontroller 可能有问题,但我在 AppDelegate.m 文件中的代码是这个:
[self.tabBarController setViewControllers:tabViewControllers];
[self.tabBarController setCustomizableViewControllers:customizableControllers];
[self.window setRootViewController:self.tabBarController];
其中 tabBarController class 是自定义 UITabViewController。
我不在我的项目中使用任何 .xib 文件!有人知道我该如何继续吗?
提前致谢
首先,尝试正常的步骤以确保一致性:
- 清理项目
- 清除您正在使用的模拟器中的所有数据
接下来,问自己以下问题:
- 在Xcode之前的版本中运行成功了吗?
- 除了新 Xcode 的必要转换之外,您是否更改了其他内容? (使用版本控制差异)。
- 是否所有警告都已解决(或至少已理解)? (我会确保所有这些都已修复)。
- 你的目标SDK/设备有变化吗? (针对以前的 iOS 版本再试一次,看看是否可以解决问题)。
使用版本控制系统的 diff
功能可以帮助解决问题 1 和 4。这可以帮助检测无意的更改,例如界面构建器元素的拼写错误或删除。
警告是相关的,因为可能有您未被告知的 SDK 更改。确保您仍以相同的 SDK 为目标可以减少这方面的不确定性。
可能导致此类错误的一些更改是:
- 移动或重命名文件
- 重命名 类
- 故事板的更改(例如,"entry" 错误被错误删除,添加了您没有意识到的额外视图,其他 "fat finger" 错误)。
- 有轻微错误或针对旧版 SDK 的代码现在在新 OS
中是致命的
- 没有 UIApplicationMain 的最后一个参数的旧代码(参见 Applications are expected to have a root view controller at the end of application launc or (as you've noted) needs to set the root view controller instead of using addSubview:
几乎所有东西都有同样的问题,来自 PowerVR 的示例代码,有时甚至来自 Apple 的示例代码。
我认为这是一个 iOS 9 问题(看起来 9 在这一点上很严格)。为了符合 iOS 9,必须在应用程序启动完成之前的某个时刻调用 setRootViewController。
为了继续,尤其是旧代码,我下载了 iOS 8.4 和 iOS 8.1 模拟器。使用完全相同的代码将它们作为目标导致了一个正常运行的项目,就像旧的 Xcode 构建一样。
类似的结果出现在设备上;将设备定位到 pre-iOS 9 OS 会导致正常运行(尽管控制台确实显示了关于根视图控制器的投诉(表示应用程序 Windows 应该有根视图控制器)),应用程序运行。
这似乎是一些已弃用的设计要求 - 没有根视图控制器的 运行 代码的 'allowance' 似乎在早期版本中被警告过,但从 [=23= 】 9、好像是正式要求的。
有些代码没有这样的规定,因此,例如,在 SDK 3.5 的 PowerVR 示例代码中(相当新 - 截至 2015 年 9 月 12 日的最高版本)必须创建某种视图控制器(他们的代码似乎没有)。
在 [self.window makeKeyAndVisible] 之后设置 self.window.rootRootController 可能会解决此问题。
这对我有用
问题发生在 Xcode 7.0.Solution 是在您的 main.m
文件中替换此代码。
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
我刚刚尝试使用新的 XCode7 beta4 运行 我的项目,但是在 运行 启动模拟器后立即给我这个异常:
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'
我读到设置主 window 的 rootViewVontroller 可能有问题,但我在 AppDelegate.m 文件中的代码是这个:
[self.tabBarController setViewControllers:tabViewControllers];
[self.tabBarController setCustomizableViewControllers:customizableControllers];
[self.window setRootViewController:self.tabBarController];
其中 tabBarController class 是自定义 UITabViewController。 我不在我的项目中使用任何 .xib 文件!有人知道我该如何继续吗?
提前致谢
首先,尝试正常的步骤以确保一致性:
- 清理项目
- 清除您正在使用的模拟器中的所有数据
接下来,问自己以下问题:
- 在Xcode之前的版本中运行成功了吗?
- 除了新 Xcode 的必要转换之外,您是否更改了其他内容? (使用版本控制差异)。
- 是否所有警告都已解决(或至少已理解)? (我会确保所有这些都已修复)。
- 你的目标SDK/设备有变化吗? (针对以前的 iOS 版本再试一次,看看是否可以解决问题)。
使用版本控制系统的 diff
功能可以帮助解决问题 1 和 4。这可以帮助检测无意的更改,例如界面构建器元素的拼写错误或删除。
警告是相关的,因为可能有您未被告知的 SDK 更改。确保您仍以相同的 SDK 为目标可以减少这方面的不确定性。
可能导致此类错误的一些更改是:
- 移动或重命名文件
- 重命名 类
- 故事板的更改(例如,"entry" 错误被错误删除,添加了您没有意识到的额外视图,其他 "fat finger" 错误)。
- 有轻微错误或针对旧版 SDK 的代码现在在新 OS 中是致命的
- 没有 UIApplicationMain 的最后一个参数的旧代码(参见 Applications are expected to have a root view controller at the end of application launc or (as you've noted) needs to set the root view controller instead of using addSubview:
几乎所有东西都有同样的问题,来自 PowerVR 的示例代码,有时甚至来自 Apple 的示例代码。
我认为这是一个 iOS 9 问题(看起来 9 在这一点上很严格)。为了符合 iOS 9,必须在应用程序启动完成之前的某个时刻调用 setRootViewController。
为了继续,尤其是旧代码,我下载了 iOS 8.4 和 iOS 8.1 模拟器。使用完全相同的代码将它们作为目标导致了一个正常运行的项目,就像旧的 Xcode 构建一样。
类似的结果出现在设备上;将设备定位到 pre-iOS 9 OS 会导致正常运行(尽管控制台确实显示了关于根视图控制器的投诉(表示应用程序 Windows 应该有根视图控制器)),应用程序运行。
这似乎是一些已弃用的设计要求 - 没有根视图控制器的 运行 代码的 'allowance' 似乎在早期版本中被警告过,但从 [=23= 】 9、好像是正式要求的。
有些代码没有这样的规定,因此,例如,在 SDK 3.5 的 PowerVR 示例代码中(相当新 - 截至 2015 年 9 月 12 日的最高版本)必须创建某种视图控制器(他们的代码似乎没有)。
在 [self.window makeKeyAndVisible] 之后设置 self.window.rootRootController 可能会解决此问题。
这对我有用
问题发生在 Xcode 7.0.Solution 是在您的 main.m
文件中替换此代码。
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}