Search code examples
iosiphoneswiftuitabbarcontrolleruitabbaritem

Items of UITabBarController not showing


I am trying to implement bottom navigation bar for my iOS application. However, when I am creating tabBarItem, it is not showing on TabBar. TabBar is displaying correctly. I cannot figure out where is the problem, any help will be very appreciated.

If any additional information is required, please give me a sign. My code (simplified):

AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.makeKeyAndVisible()

        window?.rootViewController = TabBarController()

        return true
    }
}

TabBarController:

class TabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let homeController = HomeController()
        let navigationController = UINavigationController(rootViewController: homeController)
        navigationController.title = "Home"
        navigationController.tabBarItem.image = UIImage(named: "icon")

        viewControllers = [homeController]
    } 
}

HomeController:

class HomeController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tabBarController?.tabBar.isHidden = false
    }
}

EDIT:

I removed not crucial parts of the code, like isLoggedIn() function call, mentioned in the comments and changed MainNavigationController to TabBarController.

According to Matts answer I also changed this line in a TabBarController (but still bar item is not showing for some reason):

viewControllers = [navigationController]

Solution

  • The problem is this line:

    viewControllers = [homeController]
    

    homeController is not navigationController. So what happened to navigationController? Nothing. It vanished in a puff of smoke. You created navigationController but then you threw it away.

    So nothing you say about navigationController and its configuration (including its tab bar item) has any effect; it is not in the interface (or anywhere else).

    This is my complete test code (based on your code):

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            window = UIWindow(frame: UIScreen.main.bounds)
            window?.makeKeyAndVisible()
            window?.rootViewController = MainNavigationController()
            return true
        }
    }
    class MainNavigationController: UITabBarController {
        override func viewDidLoad() {
            super.viewDidLoad()
            let homeController = HomeController()
            let navigationController = UINavigationController(rootViewController: homeController)
            navigationController.tabBarItem.title = "MyCoolTitle"
            viewControllers = [navigationController] // not [homeController]
        }
    }
    class HomeController: UIViewController {
    }