我正在尝试将现有的iOS应用转换为根视图的主详细信息视图。我在Xcode中创建了一个新的Master Detail项目作为模板。但是,尽管具有相同的 AppDelegate.swift 和几乎相同的故事板文件,但我遇到了window.rootViewController
不是故事板中定义的initialViewController
导致的异常。 / p>
来自 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创建的默认主详细信息项目中,self.window!.rootViewController
将是UISplitViewController
,但在我的应用中,它将是UINavigationController
,具体来说,是主人的导航控制器图。
这是怎么回事?根据我对rootViewController
的理解,它应该在启动时设置为initialViewController
。引用一些官方documentation:
在发布时iOS:
- 实例化一个窗口。
- 加载主故事板并实例化其初始视图控制器。
- 将新视图控制器分配给窗口的rootViewController属性,然后使窗口可见。
更新
这开始看起来像是Xcode中的一个错误。我只是通过创建一个新的Master Detail项目,将Deployment Target设置为7.1并在iPhone 5(7.1)模拟器上运行它来复制确切的例外。它在iPhone 5(8.1)模拟器上运行正常。
更新2:
我一直在使用Xcode Version 6.1 (6A1052c)
。我刚刚升级到最新版本Version 6.1.1 (6A2008a)
,但它无法解决这个易于重现的问题。我将向Apple提交一份错误报告并继续。
答案 0 :(得分:1)
您无法在8.0之前的iOS版本中使用适用于iPhone的分割视图控制器 - 仅适用于iPad。
In iOS 8 and later, you can use the UISplitViewController class on all iOS devices; in previous versions of iOS, the class is available only on iPad.