89

Hey all. I'm still pretty new to iPhone development, and I'm having a bit of trouble figuring out how to change the title of my Navigation Bar. On another question on this site somebody recommended using :

viewController.title = @"title text";

but that isn't working for me...Do I need to add a UINavigationController to accomplish this? Or maybe just an outlet from my UIViewController subclass? If it helps, I defined the navigation bar in IB and I'm trying to set its title in my UIViewController subclass. This is another one of those simple things that gives me a headache. Putting self.title = @"title text"; in viewDidLoad and initWithNibName didn't work either. Anybody know what's happening and how to get it happening right?

Thanks!

Arthur Skirvin
  • 1,210
  • 1
  • 12
  • 14

13 Answers13

154

The view controller must be a child of some UINavigationController for the .title property to take effect. If the UINavigationBar is simply a view, you need to push a navigation item containing the title, or modify the last navigation item:

UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:@"title text"];
...
[bar pushNavigationItem:item animated:YES];
[item release];

or

bar.topItem.title = @"title text";
kennytm
  • 510,854
  • 105
  • 1,084
  • 1,005
  • 8
    Wow. I've seriously spent the last hour browsing through forums and documentation trying to figure this out, and I'd convinced myself that it would be more complex than this. This code is so simple and I didn't have to re-fiddle anything in IB. Perfect! KennyTM, you rock. If I recall, you also answered my NSDate question and set me to researching dictionaries. You are my new favorite person on this site. Thanks A LOT for all your help! – Arthur Skirvin Feb 17 '10 at 13:23
  • 5
    your comment made me smile and wonder: did anyone ever make friends here in SO, ever? usually everyone here is very helpful but doesn't seem to express any human emotions (except the asker of course when he/she's frustrated) – maltalef Aug 04 '12 at 05:29
  • See Sorin's answer for a storyboard-compatible solution. – devios1 Jul 23 '13 at 21:28
  • Thanks for your answer which really save me a lot of time. :) @kennytm – jerry_sjtu Apr 27 '15 at 12:24
126

if you are doing it all by code in the viewDidLoad method of the UIViewController you should only add self.title = @"title text";

something like this:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"title";
}

you could also try self.navigationItem.title = @"title";

also check if your navigationItem is not null and if you have set a custom background to the navigationbar check if the title is set without it.

Titouan de Bailleul
  • 12,920
  • 11
  • 66
  • 121
Sorin Antohi
  • 6,145
  • 9
  • 45
  • 71
34

There's one issue with using self.title = @"title";

If you're using Navigation Bar along with Tab bar, the above line also changes the label for the Tab Bar Item. To avoid this, use what @testing suggested

self.navigationItem.title = @"MyTitle";
Titouan de Bailleul
  • 12,920
  • 11
  • 66
  • 121
Jigish
  • 1,764
  • 1
  • 15
  • 20
13

If you want to change navbar title (not navbar back button title!) this code will be work.

self.navigationController.topViewController.title = @"info";
9

If you want to change the title of a navBar inside a tabBar controller, do this:

-(void)viewDidAppear:(BOOL)animated {
    self.navigationController.navigationBar.topItem.title = @"myTitle";
}
Pantelis Proios
  • 1,359
  • 1
  • 20
  • 32
  • viewDidAppear did the trick for me after 2 hours trying to work this out. Thanks :) – Tchelow Nov 12 '14 at 10:23
  • topItem.title may or may not be the navigation bar title. If it is the top level screen with no back button, it will set the title. But if you have a back button, the topItem.title is actually the back button title. – user2962499 Mar 10 '16 at 21:33
5

In my navigation based app I do this:

myViewController.navigationItem.title = @"MyTitle";
testing
  • 19,681
  • 50
  • 236
  • 417
4

By default the navigation controller displays the title of the 'topitem'

so in your viewdidload method of your appdelegate you can. I tested it and it works

navController.navigationBar.topItem.title = @"Test";
Titouan de Bailleul
  • 12,920
  • 11
  • 66
  • 121
ronaldus_magnus
  • 311
  • 1
  • 3
  • 4
4

I had a navigation controllers integrated in a TabbarController. This worked

self.navigationItem.title=@"title";
dasdom
  • 13,975
  • 2
  • 47
  • 58
2

If you are working with Storyboards, you can click on the controller, switch to the properties tab, and set the title text there.

Guy
  • 12,250
  • 6
  • 53
  • 70
2
UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:@"title text"];
...
[bar pushNavigationItem:item animated:YES];
[item release];

This code worked.

animuson
  • 53,861
  • 28
  • 137
  • 147
rmsh
  • 21
  • 1
  • Welcome to SO and thanks for the post. It'd better look to post this info as a comment, please have a look at [How to Answer](http://stackoverflow.com/questions/how-to-answer) for more info. – Serge Belov Nov 10 '12 at 07:35
1

I guess you need a dynamic title that is why you don't set it in IB.

And I presume your viewController object is the one specified in the NIB?

Perhaps trying setting it to a dummy value in IB and then debug the methods to see which controller has the dummy value - assuming it appears as the title...

Chris Kimpton
  • 5,546
  • 6
  • 45
  • 72
1

From within your TableViewController.m :

self.navigationController.navigationBar.topItem.title = @"Blah blah Some Amazing title";

1

For all your Swift-ers out there, this worked perfectly for me. It's notably one of the shorter ways to accomplish setting the title, as well:

override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier == "presentLineItem" {
    print("Setting Title")
    var vc = segue.destinationViewController as! LineItemsTableViewController
    vc.navigationItem.title = "Line Item"
  }
}
kbpontius
  • 3,867
  • 1
  • 30
  • 34