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() 来自自定义类