I’ve brought an old project out of the moth balls recently, the Migraine Diary application I wrote as part of my master’s thesis. It was my first “real” iPhone app and I call tell I didn’t know what I was doing entirely looking through the code. What this has forced me to do, however, is re-learn some of the basics of iOS development and of Apple design patterns. I have been spending some time back in the Apple developer documentation and will probably be posting some of the gotchas that tripped me up two years ago and I’m solving now with the better, more elegant solution.
Navigation controllers are very useful things to have in your app, and are probably the easiest thing to implement WRONG. Two years ago, I assumed any time I needed a navigation bar up top that I needed to create a UINavigationController and make my view the root controller of it. Silly me.
One of the problems I was facing in the Migraine Diary app was changing the back button text when I was one or more levels deep into a navigation controller. My main view was titled “Journal Entries” and my child view “Journal Entry”. By default, the controller will title the back button as “Journal Entries” which you can see clutters up the screen.
I found a lot of ways of hacking the title online, but there is really only one “right way” according to Apple. The button titled “Journal Entries” is actually owned by the parent view. Before you push the child view onto the navigation controller, do something like this:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@”Back” style:UIBarButtonItemStyleBordered target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];
[backButton release];
Take note that you’re referring to [self navigationItem] not [[self navigationController] navigationItem] since you are in the PARENT controller.