Что произойдёт, если вызвать dismiss у последнего контроллера в стеке UINavigationController?

«Что произойдёт, если вызвать dismiss у последнего контроллера в стеке UINavigationController?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Вызов dismiss(animated:) у последнего (верхнего) контроллера в стеке навигации закроет его, вернув пользователя к предыдущему контроллеру в стеке. Это стандартное поведение для модально представленных контроллеров. Для стеков навигации обычно используют popViewController.

Сценарий и результат:

// Исходный стек навигации: [RootVC, SecondVC, TopVC]
// В TopVC вызываем:
self.dismiss(animated: true)
// Результат: стек становится [RootVC, SecondVC], TopVC удаляется.
Ключевые различия методов: Метод Назначение Результат для стека навигации
dismiss(animated:) Закрытие модально представленного контроллера. Если контроллер был в стеке навигации, он из него удаляется.
popViewController(animated:) Удаление верхнего контроллера из стека навигации. Более явный и предпочтительный способ для навигационных стеков.

Нюанс: Если dismiss вызывается у корневого (root) контроллера в стеке, ничего не произойдёт, так как нечего закрывать.