我使用UISplitViewController
,主和详细信息视图控制器,没有UINavigationControllers。
在某些情况下(例如点击通用链接时),我想强制应用程序始终显示主视图控制器。
我该怎么做?
有没有办法以编程方式从详细信息切换回主数据?
答案 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