我有一个使用导航控制器的XCode iPad项目。我试图获得一个按钮将UISplitViewController推送到导航堆栈,但是出现了这个错误:
拆分视图控制器无法推送到导航控制器
原来UISplitViewController不能很好地与UINavigationController一起使用。但是,单击此按钮时,我仍需要显示拆分视图控制器。我该怎么做呢?而且,同样重要的是,如何制作一个后退按钮,以便用户可以返回到导航控制器?
答案 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