29

Just curious, why setting self.navigationItem = ... works, but self.navigationController.navigationItem fails? The same applies for self.toolbarItems vs self.navigationController.toobarItems.

When to use self.navigationController.navigationItem?

Maybe you will say, they point to different things. but why self.navigationController.navigationBarHidden = YES the navigation bar is hidden. doesn't it means self.navigationController.navigationItem point to the bar i wanted?

Zorayr
  • 23,770
  • 8
  • 136
  • 129
limboy
  • 3,879
  • 7
  • 37
  • 53

2 Answers2

36

The class UIViewController has a property navigationItem.

This is true of all the subclasses too whether it is a UICollectionViewController, UITableViewController, UINavigationViewController or any custom subclass.

When presented by a UINavigationController the nav controller will create this property and so each view controller gets its own navigationItem. If you do not present it from a navigation controller then the navigationItem is nil.

Now, with a UINavigationController you are more than likely using this as your initial view controller. Therefore, the navigation controller is NOT being presented by another navigation controller and its navigationItem property is nil.

The navigation bar is slightly different as this is managed the other way around.

Fogmeister
  • 76,236
  • 42
  • 207
  • 306
  • does "the nav controller will create this property and so each view controller gets its own navigationItem" mean the `navigationItem` property can only be seted by parent? if this is true, why `self.navigationController.navigationItem` results to `` not nil? – limboy Jun 04 '13 at 09:05
  • after test, it turns out `self.navigationItem` won't be nil, cause after init, before added to navController `self.navigationItem` is seted. – limboy Jun 04 '13 at 09:28
  • Ah sorry, my mistake. It is true though that the navigation item is owned by the currently visible controller not by the navigation controller. – Fogmeister Jun 04 '13 at 09:31
  • Note Apple's docs: "The first time the property is accessed, the UINavigationItem object is created. Therefore, you should not access this property if you are not using a navigation controller to display the view controller" – mackworth Apr 29 '15 at 18:31
0

although set can set this property of a navigation controller: self.navigationController.navigationItem = .. but it won't work. Mainly because the navigationItem is a UIViewController's property. You can access the property because UINavigationController is inherited from UIViewController. this property is meant for any view controller that is added into a navigation controller to have a navigation bar created for them. Normally a UINavigationController won't be put into another navigation controller, so set this property of a navigation controller normally makes no sense.