iOS:无法将UISplitViewController推送到UINavigationController

时间:2012-04-05 00:38:24

标签: ios ios5 uinavigationcontroller uisplitviewcontroller

我有一个使用导航控制器的XCode iPad项目。我试图获得一个按钮将UISplitViewController推送到导航堆栈,但是出现了这个错误:

  

拆分视图控制器无法推送到导航控制器

原来UISplitViewController不能很好地与UINavigationController一起使用。但是,单击此按钮时,我仍需要显示拆分视图控制器。我该怎么做呢?而且,同样重要的是,如何制作一个后退按钮,以便用户可以返回到导航控制器?

4 个答案:

答案 0 :(得分:30)

要显示SplitViewController,您需要使用setRootViewController。这是因为SplitViewController需要是根视图控制器。

来自Apple的文档:

  

拆分视图控制器必须始终是您所有接口的根   创建。换句话说,您必须始终从a安装视图   UISplitViewController对象作为应用程序的根视图   窗口。然后可以包含拆分视图界面的窗格   导航控制器,标签栏控制器或任何其他类型的视图   控制器,你需要实现你的界面。

要回来,您需要使用setRootViewController返回上一页。当我将我的iPhone应用程序转换为通用时,我遇到了这个问题,最后使用iPhone的导航控制器和iPad版的setRootViewController。这有点令人失望,因为你不能很好地为它设置动画without a bit of fudging

答案 1 :(得分:2)

不通过导航控制器推动拆分视图控制器 可能,但是有另一种方法可以完成工作

您可以创建一个视图控制器,并将拆分的视图控制器添加为子视图,然后可以通过导航控制器推送创建的视图控制器。它将显示您的拆分视图控制器,您可以同时使用主视图和细节。

*记住,将yoursplitviewcontroller类添加到情节提要中的自定义类

说明 splitcontroller->(主,详细信息)

let splitVC = getViewController(storyBoardName: "story board name", viewControllerName: "split view controller identifier") as! yoursplitviewcontroller
        view.addSubview(splitVC.view)
        view.bounds = splitVC.view.bounds
        addChild(splitVC)

func getViewController(storyBoardName: String, viewControllerName: String) -> UIViewController{
        let storyBoard = UIStoryboard(name: storyBoardName, bundle: nil)
        return storyBoard.instantiateViewController(identifier: viewControllerName)
    }

答案 2 :(得分:2)

如果您仍然需要导航至splitView,则一种解决方法是创建一个空白的UIViewController并将splitViewController添加为子对象

/// This should be in your parent controller
/// that you to navigate your splitView
func navigateToSplit() {

    let container = UIViewController()
    let splitView = MySplitViewController() // ===> Your splitViewController
    container.addAsChildViewController(type: splitView, attached: container.view)
    navigationController?.pushViewController(container, animated: true)
}

/// this add a child controller to the view of another controller
func addAsChildViewController(type controller: UIViewController, attached toView: UIView) {

    // Add Child View Controller
    addChild(controller)

    // Add Child View as Subview
    toView.addSubview(controller.view)

    // Configure Child View
    controller.view.frame = toView.bounds
    controller.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    controller.didMove(toParent: self)

}


答案 3 :(得分:0)

我向我的应用程序添加了包含 SplitView 的第 6 个选项卡。在 iPad 上,新选项卡在选择时运行良好,但在 iPhone 上,新选项卡被移动到“更多...”选项卡,并且在选择时产生“分屏控制器无法推送到导航控制器

我通过移动新标签解决了这个问题,使其不会落入“更多...”标签。

可以在以下位置找到对该问题的更深入讨论:

Tab Bar Controller with seven tabs, Five tabs lead to Split View Controllers