Изменить эту строку:
[self.navigationController.navigationBar.topItem setRightBarButtonItem:okButton];
с этой строкой:
[[self navigationItem] setRightBarButtonItem:okButton];
Дело в том, что ко времени выполнения viewDidLoad
верхний элемент панели навигации (self.navigationController.navigationBar.topItem
) все еще указывает на элемент навигации контроллера заднего вида .
Контроллер заднего вида - это тот, который был контроллером верхнего вида до того, как текущий контроллер верхнего вида был помещен в стек ([[viewControllers objectAtIndex:[viewControllers count] - 2] navigationItem]
). В следующем фрагменте показано, как верхний элемент панели навигации по-прежнему указывает на элемент навигации контроллера заднего вида в viewDidLoad
и только для иллюстрации:
// the view controllers currently on the navigation stack
NSArray *viewControllers = self.navigationController.viewControllers;
// The root view controller is at index 0 in the array, the back view controller is at index n-2, and the top controller is at index n-1, where n is the number of items in the array.
UIViewController *backViewController = [viewControllers objectAtIndex:[viewControllers count] - 2];
// get the navigation item of the back view controller
UINavigationItem *backNavigationItem = backViewController.navigationItem;
UINavigationItem *topItem = self.navigationController.navigationBar.topItem;
if (backNavigationItem == topItem) {
NSLog(@"This gets logged to the console");
}