window.rootViewController 怎么可能不是 initialViewController?

Posted

技术标签:

【中文标题】window.rootViewController 怎么可能不是 initialViewController?【英文标题】:How could the window.rootViewController not be the initialViewController? 【发布时间】:2014-12-07 22:06:04 【问题描述】:

我正在尝试将现有的 ios 应用程序转换为将主详细信息视图作为根视图。我在 Xcode 中创建了一个新的 Master Detail 项目作为模板。然而,尽管有相同的 AppDelegate.swift 和几乎相同的故事板文件,我遇到了一个异常,因为 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的理解,应该在启动时设置为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 提交错误报告并继续前进。

【问题讨论】:

【参考方案1】:

您不能在 8.0 之前的 iOS 版本中使用适用于 iPhone 的 SplitViewController - 仅适用于 iPad。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISplitViewController_class/index.html

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.

【讨论】:

谢谢,但我的问题是“为什么它不是 rootViewController?”鉴于我已将其设置为 initialViewController。我宁愿不必对应该是默认行为的东西进行编程修复。 那么当你在debug中检查rootViewController时,它不是SplitViewController类? 这是正确的,至少对于 iPhone 5 (7.1) 的情况。 但在 iOS 8.0 之前,您不能在 iPhone 上使用 SplitViewController - 仅适用于 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. 我从未见过该页面 - 这是一个很好的参考。如果您想发布带有该答案的另一个答案以及指向该页面的链接,我会接受。谢谢。

以上是关于window.rootViewController 怎么可能不是 initialViewController?的主要内容,如果未能解决你的问题,请参考以下文章

ios 6 iPhone window.rootViewController 崩溃

window.rootViewController 怎么可能不是 initialViewController?

window是[[window rootViewController] view]的超级视图吗

ios:更改 window.rootViewController 和内存管理

为啥我似乎必须在 iOS 应用程序委托中键入 window.rootViewController?

Swift/iOS13 - UIApplication.shared.delegate.window?.rootViewController?.present() 来自自定义类