我正试图将我现有的iOS应用程序转换为具有主视图的主细节视图。我在Xcode中创建了一个新的Master Detail项目来充当模板。但是,尽管故事板文件中具有相同的AppDelegate.swift和几乎相同的故事板文件,但我遇到了window.rootViewController
不是故事板中定义的initialViewController
导致的异常。window.rootViewController怎么可能不是initialViewController?
从的Info.plist:
<key>UIMainStoryboardFile</key>
<string>Main</string>
从Main.storyboard:
<document ... initialViewController="Z2E-r9-vU1">
<!-- ... -->
<!--SplitViewTitle-->
<scene sceneID="dlH-f9-ql3">
<objects>
<splitViewController title="SplitViewTitle" id="Z2E-r9-vU1" sceneMemberID="viewController">
异常这里发生在AppDelegate.swift:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let splitViewController = self.window!.rootViewController as UISplitViewController
在由Xcode创建的默认Master Detail项目中,self.window!.rootViewController
将是UISplitViewController
,但在我的应用程序中,它将是UINavigationController
,特别是主视图的导航控制器。
这怎么可能?从我对rootViewController
的理解中,它应该在发布时设置为。引用一些官方documentation:
在启动时的iOS:
- 实例化一个窗口。
- 加载主故事板并实例化其初始视图控制器。
- 将新的视图控制器分配给窗口的rootViewController属性,然后使窗口可见。
更新:
这是开始看起来像在Xcode的错误。我只是通过创建一个新的主细节项目来再现确切的异常,将部署目标设置为7.1并在iPhone 5(7.1)模拟器上运行它。它可以在iPhone 5(8.1)模拟器上正常工作。
更新2: 我一直在使用Xcode Version 6.1 (6A1052c)
。我刚刚升级到最新版本,Version 6.1.1 (6A2008a)
,但它不能解决这个容易重现的问题。我将向Apple提交一份错误报告,然后继续。
谢谢,但我的问题是 “为什么是不是RootViewController的?”因为我已经将它设置为initialViewController。我宁愿不必为某些应该是默认行为的程序修复程序。 – 2014-12-08 16:54:00
因此,当您在调试中检查rootViewController时,它不是SplitViewController类吗? – 2014-12-09 12:24:04
这是正确的,至少对于iPhone 5(7.1)的情况。 – 2014-12-09 22:24:51