使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - iOS Swift 从应用程序委托呈现视图

Posted

技术标签:

【中文标题】使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - iOS Swift 从应用程序委托呈现视图【英文标题】:Present view from app delegate with a tabbar Controller-> Nav controller -> View Hierarchy - iOS Swift 【发布时间】:2017-03-07 15:48:55 【问题描述】:

我搜索了整个 S.O 并找到了类似的文章,但没有一个解决方案适合我。下面是我的视图层次结构的截图

我尝试过的众多sn-ps代码之一如下:

            var storyBoard = UIStoryboard()
            if UIDevice.current.userInterfaceIdiom == .pad 
                storyBoard = UIStoryboard(name: "iPad", bundle: nil)
             else 
                storyBoard = UIStoryboard(name: "Main", bundle: nil)
            


            let tabVc = self.window?.rootViewController as! UITabBarController


            let mynVC = storyBoard.instantiateViewController(withIdentifier: "nav") as! UINavigationController


            let calcVc = storyBoard.instantiateViewController(withIdentifier: "destVc")


            tabVc.present(mynVC, animated: true, completion:  () -> Void in
              // Segue , do stuff

            )

上面的代码显示了带有导航栏的正确选项卡,但是没有选项卡。

我想要一个强制触摸按钮,它显示带有导航栏和标签栏的标签,有人知道怎么做吗?

【问题讨论】:

为什么标签栏视图控制器呈现导航控制器?您需要在标签栏视图控制器中将导航控制器设置为当前控制器。您可能需要在标签栏视图控制器上设置视图控制器数组,其中此导航控制器是数组中的一项。 【参考方案1】:

我目前无法对此进行全面测试,但我相信在标签栏中,您不会显示视图控制器。你设置它的视图控制器项目和 selectedViewController 属性。

这应该可以了,我会尽快测试并更新,

var storyBoard = UIStoryboard()
        if UIDevice.current.userInterfaceIdiom == .pad 
            storyBoard = UIStoryboard(name: "iPad", bundle: nil)
         else 
            storyBoard = UIStoryboard(name: "Main", bundle: nil)
        


        let tabVc = self.window?.rootViewController as! UITabBarController

        let mynVC = storyBoard.instantiateViewController(withIdentifier: "nav") as! UINavigationController

        let calcVc = storyBoard.instantiateViewController(withIdentifier: "destVc")

        tabVc.viewControllers = [mynVC]
        tabVc.selectedViewController = mynVC

根据您下面的其他内容,您可能还需要调用 window.setKeyAndVisible() 来实际显示

【讨论】:

工作得很好,我最终编辑了 tabVc.viewController = [mynVC] 以在我的实际项目中添加另一个选项卡。这似乎产生了我正在寻找的确切结果。谢谢,要测试然后标记为已接受的答案。 太好了,很高兴得到帮助:) 祝项目顺利 快速提问,如果我想显示视图控制器,然后使用此实现转到另一个视图控制器。我可以直接调用“calcVc.performsegue(withIdentifier: "testSegue", sender: self)" 吗? 是的,您应该能够毫无问题地做到这一点。只要注册了segue

以上是关于使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - iOS Swift 从应用程序委托呈现视图的主要内容,如果未能解决你的问题,请参考以下文章

将标签栏控制器与导航控制器一起使用时出现问题

组合标签栏和导航栏控制器出现问题

同时使用导航控制器和标签栏

使用标签栏和导航实例化深度视图控制器

如何将导航控制器嵌入到标签栏控制器

导航和标签栏控制器未显示