25

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

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

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

4

4 回答 4

32

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

来自 Apple 的文档:

拆分视图控制器必须始终是您创建的任何界面的根。换句话说,您必须始终将 UISplitViewController 对象中的视图安装为应用程序窗口的根视图。然后,拆分视图界面的窗格可能包含导航控制器、选项卡栏控制器或您实现界面所需的任何其他类型的视图控制器。

要返回,您需要使用 setRootViewController 返回上一页。当我将我的 iPhone 应用程序转换为通用应用程序时遇到了这个问题,最终我使用了 iPhone 的导航控制器和 iPad 版本的 setRootViewController。这有点令人沮丧,因为如果不加一点修饰就无法很好地制作动画

于 2012-04-05T00:57:46.097 回答
3

如果您仍需要导航到,一种解决方法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)
}


extension UIViewController {
    /// 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)
        
    }
}


于 2020-06-29T10:27:31.077 回答
2

无法通过导航控制器推送拆分视图控制器,但有一种替代方法可以完成工作

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

*记得将 yoursplitviewcontroller 类添加到故事板中的自定义类中

注意splitcontroller -> (master, detail)

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)
    }
于 2020-05-14T18:16:23.047 回答
0

我在我的应用程序中添加了包含 SplitView 的第 6 个选项卡。在 iPad 上,新选项卡在选择时工作正常,但在 iPhone 上,新选项卡被移动到“更多...”选项卡,并且在选择时产生“拆分视图控制器无法推送到导航控制器 <UIMoreNavigationController:”消息。

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

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

带有七个选项卡的选项卡栏控制器,五个选项卡导致拆分视图控制器

于 2021-05-27T14:22:49.243 回答