Как скрыть заголовок кнопки Назад при первом запуске iOS
Узнайте, как убрать название кнопки Назад в первом запуске iOS‑приложения, установив backButtonDisplayMode до рендеринга, чтобы интерфейс выглядел чисто и без лишних надписей, а пользовательский опыт стал более плавным. Это особенно важно при сложных стековых переходах, где лишний текст может сбивать с толку. Следуйте простому шагу, чтобы сразу убрать заголовок.
Как скрыть заголовок кнопки «Назад» при первом запуске iOS‑приложения, если я использую собственный UINavigationController?
Я ставлю navigationBar.topItem?.backButtonDisplayMode = .minimal внутри viewWillLayoutSubviews, и это работает после первого push, но при самом первом запуске кнопка «Назад» всё равно показывает заголовок. Что вызывает такое поведение и как убедиться, что заголовок удалён с кнопки «Назад» уже при первом запуске?
Заголовок всё ещё отображается на первом экране, потому что, на самом деле, topItem навигационной панели при запуске — это навигационный элемент корневого контроллера, которому ещё не задали backButtonDisplayMode. Заголовок кнопки «Назад» наследуется от предыдущего контроллера, поэтому настройка, которую вы применяете в viewWillLayoutSubviews, вступает в силу только после изменения стека. Чтобы скрыть заголовок с самого первого запуска, задайте backButtonDisplayMode = .minimal до того, как кнопка «Назад» будет отрисована — либо на контроллере, который будет запушен, либо на предыдущем контроллере, который предоставляет текст кнопки.
Содержание
- Почему заголовок остаётся видимым при первом запуске
- Как корректно задать
backButtonDisplayMode - Альтернативные решения
- Итоги
- Источники
Почему заголовок остаётся видимым при первом запуске
Когда приложение запускается, стек навигационного контроллера содержит только корневой контроллер.
viewWillLayoutSubviews навигационного контроллера выполняется до того, как навигационная панель полностью выстроит свои элементы, поэтому navigationBar.topItem всё ещё указывает на навигационный элемент корневого контроллера.
backButtonDisplayMode управляет внешним видом кнопки «Назад», которая принадлежит следующему контроллеру в стеке. Поскольку на момент вызова свойства ещё нет следующего контроллера, установка параметра не влияет на кнопку, которая появится после первого push.
На последующих push’ах navigationBar.topItem меняется на новый контроллер, и присвоение в viewWillLayoutSubviews корректно скрывает заголовок.
Как корректно задать backButtonDisplayMode
1. Установить свойство в viewDidLoad каждого контроллера
class DetailViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Скрыть заголовок в кнопке «Назад» при переходе на этот VC
navigationItem.backButtonDisplayMode = .minimal
}
}
Почему это работает:
Когда навигационный контроллер пушит DetailViewController, панель сразу же запрашивает его navigationItem. Поскольку свойство уже установлено, кнопка «Назад» отображается только со стрелкой.
2. Установить пустой backBarButtonItem у предыдущего контроллера
class RootViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Удалить заголовок для кнопки «Назад» следующего VC
navigationItem.backBarButtonItem = UIBarButtonItem(title: "",
style: .plain,
target: nil,
action: nil)
}
}
Почему это работает:
backBarButtonItem является источником текста кнопки «Назад» для следующего контроллера. Предоставив пустой заголовок, вы заставляете кнопку стать минимальной даже до того, как следующий VC будет запушен.
3. Установить в viewDidAppear после первого push
class DetailViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
navigationItem.backButtonDisplayMode = .minimal
}
}
Почему это работает:
viewDidAppear вызывается после того, как навигационная панель уже отрисовала кнопку «Назад», поэтому заголовок можно убрать сразу же.
Альтернативные решения
| Решение | Когда использовать | Пример |
|---|---|---|
navigationBar.topItem?.backButtonDisplayMode = .minimal в viewDidLayoutSubviews кастомного UINavigationController |
Если нужно задать для всех контроллеров одновременно | override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews(); navigationBar.topItem?.backButtonDisplayMode = .minimal } |
Переопределить preferredTitleTextAttributes |
При необходимости изменить цвет/шрифт вместо скрытия | navigationItem.backButtonDisplayMode = .minimal; navigationItem.backButtonTitle = "" |
Использовать UINavigationItem вместо UINavigationBar |
Если хотите управлять отдельным элементом | let item = UINavigationItem(); item.backButtonDisplayMode = .minimal |
Итоги
- Причина: На первом запуске
navigationBar.topItemотносится к корневому контроллеру, а свойствоbackButtonDisplayModeвлияет только на кнопку, принадлежащую следующему контроллеру, поэтому заголовок остаётся. - Как исправить: Задавайте
backButtonDisplayMode = .minimalна контроллере, который будет отображён после корня (обычно вviewDidLoadилиviewDidAppear) либо удаляйте заголовок у предыдущего контроллера через пустойbackBarButtonItem. - Проверка: После внедрения одного из подходов первая и последующие экраны будут показывать только стрелку без текста.
Ключевой совет: всегда задавайте
backButtonDisplayModeв момент, когда контроллер уже добавлен в стек, либо заранее очищайтеbackBarButtonItemу предыдущего контроллера.
Источники
- Apple Developer Documentation –
UINavigationItem.BackButtonDisplayMode - Stack Overflow – “Use
navigationItem.backButtonDisplayMode = .minimalwith a custom back button image” - Stack Overflow – “iOS UINavigationBar adds title to back button”
- Sarunw – “A new way to manage the back button title in iOS 14 with backButtonDisplayMode”