【问题标题】:How can I show ViewController in UITabBarController?如何在 UITabBarController 中显示 ViewController?
【发布时间】:2017-04-23 19:23:05
【问题描述】:

我有一个 UITabBarController 并且我所有的其他视图控制器都连接到它。现在我想将我的控制器显示为:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc: ViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController

但是当我尝试这样做时:

let rootViewController = self.window?.rootViewController as! UINavigationController
rootViewController.pushViewController(vc, animated: true)

它给了我下一个错误:

Could not cast value of type 'UITabBarController' (0x1a899b818) to 'UINavigationController'

后来我尝试过:

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

但在这种情况下我得到了

UITabBar has no member pushViewController

如何显示/推送我的 ViewController,以便它与 UINavigationBar 和 UITabBar 一起出现?

【问题讨论】:

    标签: ios swift storyboard uitabbarcontroller pushviewcontroller


    【解决方案1】:

    您需要将每个视图控制器放置在导航控制器中。

    例如目前你有一个 TabBarViewController 和两个视图控制器:

    • ViewControllerA
    • ViewControllerB

    您需要做的是将它们中的每一个嵌入到导航控制器中,这样您就可以:

    • UINavigationController -> ViewControllerA
    • UINavigationController -> ViewControllerB

    为了推送一个新的控制器,你可以这样做:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc: ViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
    
    let navViewController = myTabBar.selectedViewController as? UINavigationController
    navViewController?.pushViewController(vc, animated: true)
    

    【讨论】:

    • 我在 AppDelegate 中执行此操作,因此从这里看不到 myTabBar。我可以用UITabBarController 代替吗?
    • @J.Doe 可以这样获取:let myTabBar = self.window?.rootViewController as? UITabBarController
    • 好答案,拯救了我的一天。
    • 很好的答案,也拯救了我的一天!
    【解决方案2】:

    Could not cast value of type 'UITabBarController' (0x1a899b818) to 'UINavigationController'

    您的根视图控制器的类型为UITabBarController。 因此,您必须使用此类的适当方法,而不是 UINavigationController。 要设置视图控制器,请使用

    var viewControllers: [UIViewController]?

    func setViewControllers([UIViewController]?, animated: Bool).

    要拥有导航栏,您必须实例化 UINavigationController 并将您的视图控制器添加到此导航控制器。 然后通过上述选项之一将您的导航控制器添加到您的 UITabBarController。

    【讨论】:

      【解决方案3】:

      如果你的类是 UITabBarController 你可以添加这个:

      private func showViewController() {
          let storyboard = UIStoryboard(name: "Main", bundle: nil)
          guard let vc = storyboard.instantiateViewController(withIdentifier: "queueTableViewController") as? QueueTableViewController else { return }
          let navVC = self.selectedViewController as? UINavigationController
          navVC?.pushViewController(vc, animated: true)
      }
      

      这将允许你去任何 VC

      第二种解决方案是这样的。 在这里,您将显示最后一个 VC,然后从那里推送一些 VC。

          guard let tabCount = viewControllers?.count, tabCount > 1 else { return }
          selectedIndex = tabCount - 1
          if let navigationController = viewControllers?[selectedIndex] as? UINavigationController {
              if let accountVC = navigationController.visibleViewController as? FirstViewController {
                  let storyboard = UIStoryboard(name: "Main", bundle: nil)
                  guard let vc = storyboard.instantiateViewController(withIdentifier: "someViewController") as? SomeViewController else { return }
                  accountVC.navigationController?.pushViewController(vc, animated: true)
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多