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

8
我正在使用UISplitViewController,其中包括主视图控制器详细视图控制器,没有UINavigationControllers
在某些情况下(例如单击通用链接时),我希望强制应用程序始终显示主视图控制器。
我该怎么做?
是否有一种方法可以通过编程方式从详细信息切换回主视图?

这是您要找的内容吗:https://dev59.com/Tl8e5IYBdhLWcg3wTJCL - zombie
嗨 @zombie,那里的答案似乎在谈论始终通过设置一些委托函数在主控制器上启动应用程序。但是在我的情况下,我想手动解除详细视图控制器。肯定有方法可以做到这一点吧? - Daniele B
4个回答

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

如果主视图还推送主视图中的视图并显示详细视图,情况可能会变得更加复杂。此代码将弹出到主视图导航栈的根。


4
您可以设置preferredDisplayMode。该属性用于指定首选显示模式。
self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.allVisible

如果您正在寻找类似于切换操作的功能:
extension UISplitViewController {
   func toggleMasterView() {
      let barButtonItem = self.displayModeButtonItem
      UIApplication.shared.sendAction(barButtonItem.action!, to: barButtonItem.target, from: nil, for: nil)
   }
}

使用方法:

self.splitViewController?.toggleMasterView()

4
你可以定义一个自定义的UISplitViewController,并将其分配给你的故事板中的分割视图:
import UIKit

class GlobalSplitViewController: UISplitViewController, UISplitViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
        return true
    }
}

1
我的解决方案是,在用户使用iPad时交换您的主要和次要视图控制器的位置。然后设置preferredDisplayMode = .primaryHidden。以下是示例代码。
splitViewVieController = UISplitViewController()
let isIphone = UIDevice.current.userInterfaceIdiom == .phone
splitViewVieController.viewControllers = isIphone ? [primaryNavController, seconaryNavController] : [seconaryNavController, primaryNavController]
splitViewVieController.preferredDisplayMode = .primaryHidden

如果需要,我们可以更改主要ViewController的位置或宽度。

splitViewVieController.maximumPrimaryColumnWidth = splitViewVieController.view.bounds.width
splitViewVieController.preferredPrimaryColumnWidthFraction = 0.5
splitViewVieController.primaryEdge = .trailing

这很聪明!! - hyouuu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接