我有一个通用应用程序,它使用两个不同的UISplitview控制器来控制两个不同的主/细节信息集(一种数据类型嵌套在另一种数据类型中)。
我通过调用以下函数从第一个切换到另一个:
@IBAction func viewEntries(sender: AnyObject) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let entriesSplitView = storyboard.instantiateViewControllerWithIdentifier("entriesSplitView") as! UISplitViewController
entriesSplitView.delegate = self.appDelegate
UIView.transitionWithView(self.view.window!, duration: 0.25, options: .TransitionCrossDissolve, animations:
{
self.appDelegate.window?.rootViewController = entriesSplitView
}, completion: nil)
}
在此辅助 UISplitView 的主视图控制器中,我设置了导航控制器的 leftBarButton 以触发类似的函数以返回到原始的、最顶级的 UISplitView。
我唯一的问题是,我想确保在iPhone上,在此过渡之后显示的第一个视图是细节视图控制器,但我希望首先使用主视图控制器,然后能够查看细节。 我可以通过添加以下内容来解决这个问题:
let masterNavigationController = entriesSplitView.viewControllers[0] as! UINavigationController
masterNavigationController.popToRootViewControllerAnimated(false)
self.appDelegate.window?.rootViewController = entriesSplitView
之后,但当我这样做时,有一个快速的闪烁。如果我把它放在那个电话之前,它不会产生预期的效果。
关于确保主视图是初始调用的主视图,同时允许访问详细信息视图的正确方法的任何想法?
我认为UISplitViewControllerDelegate是你的朋友。
使根视图控制器成为拆分视图控制器的委托:
self.splitViewController?.delegate = self
然后实现以下方法:
extension MyViewController : UISplitViewControllerDelegate {
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
return true
}
}
这将强制拆分视图控制器在水平紧凑的环境中默认显示主节点。可能需要函数主体中的自定义逻辑才能为应用创建所需的效果,但这是执行此操作的地方。