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

时间:2016-11-22 08:26:51

标签: ios swift uisplitviewcontroller master-detail

我使用UISplitViewController详细信息视图控制器,没有UINavigationControllers。

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

我该怎么做?

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

4 个答案:

答案 0 :(得分:3)

您可以设置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()

答案 1 :(得分:3)

拆分视图控制器是一个野兽,文档令人困惑。最好通过将其视为以两种不同模式运行来理解:崩溃与否。当分割视图以水平紧凑视图(即iPhone)呈现时,折叠模式适用,否则不折叠(即iPad)。

属性 preferredDisplayMode 仅在视图未折叠(即iPad)时适用,您可以使用此选项来选择主视图或详细视图。

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

  

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

但是使用导航控制器要好得多,因为拆分视图控制器可以与它们配合使用:

  

拆分视图控制器知道如何调整界面   直观的方式。它甚至适用于其他容器视图控制器   (如导航控制器)来呈现视图控制器。

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

  

在水平紧凑的环境中,分割视图控制器起作用   更像是导航控制器,显示主视图   最初控制器并推送或弹出辅助视图   控制器根据需要

所以你可以这样做:

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

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

答案 2 :(得分:2)

您可以定义一个自定义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
    }
}

答案 3 :(得分:1)

我的解决方案是,如果用户使用iPad,则交换主要和次要ViewController的位置。然后设置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