强制 UISplitViewController(以编程方式创建的 rootViewController)在 Swift



我有一个通用应用程序,它使用两个不同的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
    }
}

这将强制拆分视图控制器在水平紧凑的环境中默认显示主节点。可能需要函数主体中的自定义逻辑才能为应用创建所需的效果,但这是执行此操作的地方。

相关内容

  • 没有找到相关文章

最新更新