简体   繁体   中英

How can I show ViewController in UITabBarController?

I have a UITabBarController and all my other view controllers are connected to it. Now I want to show one my controller as:

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

but when I tried to:

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

it gave me the next error:

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

Later I've tried to do:

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

but in this case I get

UITabBar has no member pushViewController

How can I show/push my ViewController so it will appear with UINavigationBar and inside of UITabBar?

You need to place each of your view controllers inside a navigation controller.

Eg currently you have a TabBarViewController and two view controllers:

  • ViewControllerA
  • ViewControllerB

What you need to do is to embed each of them inside a navigation controller so you would have:

  • UINavigationController -> ViewControllerA
  • UINavigationController -> ViewControllerB

In order to push a new controller you would do:

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)

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

Your root view controller is of type UITabBarController . Therefore you have to use the appropriate methods of this class and not UINavigationController. To set view controllers use either

var viewControllers: [UIViewController]? or

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

To have a navigation bar you have to instantiate a UINavigationController and add your view controller to this navigation controller. Then add your navigation controller to your UITabBarController with via one of the above options.

If your class is UITabBarController You can add this:

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

This will allow you to go to any VC

The second solution is something like this. Here You will show the last VC and from there push some 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)
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM