Откуда этот 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";
}
Другие вопросы по тегам