分割视图控制器很强大,但文档很令人困惑。最好将其视为在两种不同模式下运行:折叠或非折叠。当分割视图在水平紧凑视图中显示时(即iPhone),应用折叠模式;否则不折叠(即iPad)。
属性preferredDisplayMode仅适用于未折叠的视图(即iPad),您可以使用此属性来选择主视图或详细视图。
在折叠模式下,除非您使用导航控制器,否则原始主视图可能会被丢弃:
“在折叠之后,分割视图控制器报告其viewControllers属性中只有一个子视图控制器。委托对象的帮助下,另一个视图控制器会折叠到其他视图控制器的内容中,或者暂时被丢弃。”
但最好使用导航控制器,因为分割视图控制器是设计与它们协同工作的:
“分割视图控制器知道如何以更直观的方式调整界面。它甚至可以与其他容器视图控制器(如导航控制器)一起使用来呈现视图控制器。”
如果您正在使用导航控制器,则原始主视图可能位于导航堆栈的底部:
“在水平紧凑的环境中,分割视图控制器的行为更像导航控制器,最初显示主要视图控制器,并根据需要推送或弹出次要视图控制器。”
因此,您可以这样做:
if split.isCollapsed,
let nav = split.viewControllers[0] as? UINavigationController
{
nav.popToRootViewController(animated:false)
} else {
split.preferredDisplayMode = .allVisible
}
如果主视图还推送主视图中的视图并显示详细视图,情况可能会变得更加复杂。此代码将弹出到主视图导航栈的根。