UISplitViewController:如何强制显示主视图控制器

Dan*_*e B 5 master-detail uisplitviewcontroller ios swift

我正在使用a UISplitViewController,使用masterdetail viewcontrollers,没有UINavigationControllers.

在某些情况下(例如,当点击通用链接时),我想强制应用程序始终显示主视图控制器.

我怎样才能做到这一点?

有没有办法以编程方式从细节切换回主数据?

Dal*_*ale 7

拆分视图控制器是一头野兽,文档令人困惑。最好将其视为在两种不同模式下运行来了解:崩溃或不崩溃。当在水平紧凑视图中显示拆分视图(即iPhone)时,将应用折叠模式,否则将其折叠(即iPad)。

仅当视图未折叠时(即iPad),preferredDisplayMode属性才适用,您可以使用它来选择主视图或局部视图。

在折叠模式下,除非使用导航控制器,否则原始主视图可能会被丢弃:

折叠后,拆分视图控制器报告其viewControllers属性中只有一个子视图控制器。在委托对象的帮助下,另一个视图控制器折叠到另一个视图控制器的内容中,或被暂时丢弃

但是,最好使用导航控制器,因为拆分视图控制器旨在与它们结合使用:

拆分视图控制器知道如何以更直观的方式调整界面。它甚至可以与其他容器视图控制器(例如导航控制器)一起显示视图控制器。

如果使用导航控制器,则原始主视图可能位于导航堆栈的底部:

在水平紧凑的环境中,拆分视图控制器的行为更类似于导航控制器,首先显示主视图控制器,然后根据需要推入或弹出辅助视图控制器

因此,您可以执行以下操作:

if split.isCollapsed,
   let nav = split.viewControllers[0] as? UINavigationController
{
   nav.popToRootViewController(animated:false)
} else {
   split.preferredDisplayMode = .allVisible 
}
Run Code Online (Sandbox Code Playgroud)

(如果您的主视图将主视图推入主视图并显示详细视图,则可能会变得更加复杂。此代码将弹出到主视图导航堆栈的根目录中)


zom*_*bie 4

您可以设置preferredDisplayMode

self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.allVisible
Run Code Online (Sandbox Code Playgroud)

或者,如果您正在寻找诸如切换操作之类的东西:

extension UISplitViewController {
   func toggleMasterView() {
      let barButtonItem = self.displayModeButtonItem
      UIApplication.shared.sendAction(barButtonItem.action!, to: barButtonItem.target, from: nil, for: nil)
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

self.splitViewController?.toggleMasterView()
Run Code Online (Sandbox Code Playgroud)