Откуда этот backBarButtonItem приходит снова?
У меня есть UINavigationController (A), который имеет несколько подпредставлений, которые также являются UIViewControllers (B и C). Основной UINavigationController (A) находится внутри UITabViewController (D).
Я пытаюсь подтолкнуть контроллер представления в B:[self.navigationController pushViewController... etc]
Теперь backBarButtonItem имеет неправильный текст. Вместо того чтобы сказать "Назад", он просто говорит "Предмет". Вероятно, это связано с тем, что один из контроллеров представления в моей цепочке имеет заголовок, равный "Item", или, возможно, он равен нулю.
Мой вопрос, где генерируется backBarButtonItem?
Я попробовал несколько разных вещей, которые не сработали. Я попробовал каждую из этих строк кода в B прямо перед тем, как нажать контроллер представления. Никто из них не работал.
self.presentingViewController.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc
self.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc
self.navigationController.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc
Я хотел бы изучить принцип здесь, чтобы я действительно понял, откуда этот элемент заполняется и как правильно это сделать.
1 ответ
Скажем ваш C
контроллер находится на вершине стека навигационного контроллера, и ваш B
Контроллер находится под этим. Например
navigationController.viewControllers = @[ bViewController, cViewController ];
Таким образом, навигационный контроллер отображает cViewController.view
,
Контроллер навигации использует контроллер второго уровня в своем стеке для настройки кнопки возврата. В этом случае он использует bViewController
настроить кнопку назад. Это его алгоритм:
UINavigationItem *navigationItem = bViewController.navigationItem;
UIBarButtonItem *barItem = navigationItem.backBarButtonItem;
if (barItem.image != nil) {
show a back button containing barItem.image;
}
else if (barItem.title != nil) {
if (barItem.title.length > 0) {
show a back button containing barItem.title;
} else {
don't show a back button;
}
}
else if (navigationItem.title != nil) {
if (navigationItem.title.length > 0) {
show a back button containing navigationItem.title;
} else {
don't show a back button;
}
}
else {
show a back button containing @"Back";
}