0

我有一个通用应用程序,它使用两个不同的 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,但是当我这样做时,会快速闪烁。如果我把它放在那个电话之前,它不会产生预期的效果。

关于确保主视图是第一个调用的正确方法的任何想法,同时还允许访问详细视图?

4

1 回答 1

0

我认为 UISplitViewControllerDelegate 是你的朋友。

使您的根视图控制器成为拆分视图控制器的委托:

self.splitViewController?.delegate = self

然后实现以下方法:

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

这将强制拆分视图控制器在水平紧凑的环境中默认显示主视图。您可能需要在函数主体中自定义逻辑来为您的应用程序创建所需的效果,但这就是这样做的地方。

于 2016-03-24T14:09:35.623 回答