Imran Imran - 3 months ago 37
iOS Question

iOS 8 Swift navigation bar title, buttons not showing in tab based application

I am trying to follow this tutorial, this answer, and this answer to create navigation bars for each of my tabs in a tab-based application in iOS 8 / Swift, but no title or buttons on my navigation bar are showing.

Here is what I have so far:

// AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let tabBarController = UITabBarController()

let vc1 = ViewController()
let vc2 = ViewController()
let vc3 = ViewController()

let nc1 = UINavigationController(rootViewController: vc1)
let nc2 = UINavigationController(rootViewController: vc2)
let nc3 = UINavigationController(rootViewController: vc3)

let controllers = [nc1,nc2,nc3]

tabBarController.viewControllers = controllers

nc1.tabBarItem = UITabBarItem(title: "item1", image: nil, tag: 1)
nc2.tabBarItem = UITabBarItem(title: "item2", image: nil, tag: 1)
nc3.tabBarItem = UITabBarItem(title: "item3", image: nil, tag: 1)

window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.rootViewController = tabBarController
window?.makeKeyAndVisible()

return true
}

// ViewController.swift
class ViewController: UIViewController, UINavigationBarDelegate {

override func viewDidLoad() {
super.viewDidLoad()

let navigationBar = UINavigationBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 44))
navigationBar.backgroundColor = UIColor.blueColor()
navigationBar.delegate = self;

let navigationItem = UINavigationItem()
navigationItem.title = "Title"

let leftButton = UIBarButtonItem(title: "Left Button", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
let rightButton = UIBarButtonItem(title: "Right Button", style: UIBarButtonItemStyle.Plain, target: self, action: nil)

navigationItem.leftBarButtonItem = leftButton
navigationItem.rightBarButtonItem = rightButton

navigationBar.items = [navigationItem]

}

func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
return UIBarPosition.TopAttached
}
}


But I am just getting a blank navigation bar on top in the simulator.

iPhone 6 simulator screenshot

Answer

You're making a custom UINavigationBar when one is already provided to you with the UINavigationController.

Try this instead in your ViewController:

override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "Title"

    let navigationBar = navigationController!.navigationBar
    navigationBar.tintColor = UIColor.blueColor()

    let leftButton =  UIBarButtonItem(title: "Left Button", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
    let rightButton = UIBarButtonItem(title: "Right Button", style: UIBarButtonItemStyle.Plain, target: self, action: nil)

    navigationItem.leftBarButtonItem = leftButton
    navigationItem.rightBarButtonItem = rightButton
}