【问题标题】:iOS: UISplitViewController cannot be pushed to UINavigationControlleriOS:UISplitViewController 无法推送到 UINavigationController
【发布时间】:2012-04-18 18:09:39
【问题描述】:

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

拆分视图控制器不能推送到导航控制器

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

【问题讨论】:

    标签: ios ios5 uinavigationcontroller uisplitviewcontroller


    【解决方案1】:

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

    来自 Apple 的文档:

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

    要返回,您需要使用 setRootViewController 返回之前的页面。当我将我的 iPhone 应用程序转换为通用应用程序时遇到了这个问题,最终我使用了 iPhone 的导航控制器和 iPad 版本的 setRootViewController。这有点令人遗憾,因为你不能很好地为它制作动画without a bit of fudging

    【讨论】:

    • 我将如何使用 setRootViewController? Google 告诉我这是 UIWindow 的一种方法,但我不知道在哪里可以找到 UIWindow 实例。
    • 您需要从您的应用程序委托中将其作为属性获取,如下所示: MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];然后 [appDelegate.window setRootViewController:shareSelectViewController];
    【解决方案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)
    }
    
    
    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)
            
        }
    }
    
    
    

    【讨论】:

    • 使用上述代码时出错:'UIViewController' 类型的值没有成员'addAsChildViewController'
    • 将此函数func addAsChildViewController添加为UIViewController的扩展
    【解决方案3】:

    通过导航控制器推送拆分视图控制器不是 可能,但有一个替代方案可以完成工作

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

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

    note 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)
        }
    

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多