我有一个使用导航控制器的 XCode iPad 项目。我试图获得一个按钮来将 UISplitViewController 推送到导航堆栈,但出现此错误:
拆分视图控制器无法推送到导航控制器
原来 UISplitViewController 不能很好地与 UINavigationController 配合使用。但是,单击此按钮时,我仍然需要显示拆分视图控制器。我该怎么做呢?而且,同样重要的是,我如何制作一个后退按钮,以便用户可以返回到导航控制器?
我有一个使用导航控制器的 XCode iPad 项目。我试图获得一个按钮来将 UISplitViewController 推送到导航堆栈,但出现此错误:
拆分视图控制器无法推送到导航控制器
原来 UISplitViewController 不能很好地与 UINavigationController 配合使用。但是,单击此按钮时,我仍然需要显示拆分视图控制器。我该怎么做呢?而且,同样重要的是,我如何制作一个后退按钮,以便用户可以返回到导航控制器?
要显示 SplitViewController,您需要使用 setRootViewController。这是因为 SplitViewController 需要是根视图控制器。
来自 Apple 的文档:
拆分视图控制器必须始终是您创建的任何界面的根。换句话说,您必须始终将 UISplitViewController 对象中的视图安装为应用程序窗口的根视图。然后,拆分视图界面的窗格可能包含导航控制器、选项卡栏控制器或您实现界面所需的任何其他类型的视图控制器。
要返回,您需要使用 setRootViewController 返回上一页。当我将我的 iPhone 应用程序转换为通用应用程序时遇到了这个问题,最终我使用了 iPhone 的导航控制器和 iPad 版本的 setRootViewController。这有点令人沮丧,因为如果不加一点修饰就无法很好地制作动画。
如果您仍需要导航到,一种解决方法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)
}
}
无法通过导航控制器推送拆分视图控制器,但有一种替代方法可以完成工作
您可以创建一个视图控制器并将拆分视图控制器添加为子视图,然后您可以通过导航控制器推送创建的视图控制器。它将显示您的拆分视图控制器,您可以同时使用主视图和细节。
*记得将 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)
}
我在我的应用程序中添加了包含 SplitView 的第 6 个选项卡。在 iPad 上,新选项卡在选择时工作正常,但在 iPhone 上,新选项卡被移动到“更多...”选项卡,并且在选择时产生“拆分视图控制器无法推送到导航控制器 <UIMoreNavigationController:”消息。
我通过移动新标签解决了这个问题,这样它就不会落入“更多...”标签中。
可以在以下位置找到对该问题的更深入讨论: