【问题标题】:Present view from app delegate with a tabbar Controller-> Nav controller -> View Hierarchy - iOS Swift使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - 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

            })

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

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

【问题讨论】:

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

标签: ios swift uinavigationcontroller uitabbarcontroller appdelegate


【解决方案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
猜你喜欢
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2013-04-27
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多