Как UINavigationController управляет стеком view-контроллеров?

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

Ответ

UINavigationController хранит дочерние view-контроллеры в стековой структуре — массиве viewControllers. Управление происходит по принципу LIFO (Last-In, First-Out).

Основные операции:

  • Push: Добавление контроллера в конец стека (он становится видимым).
    navigationController?.pushViewController(detailVC, animated: true)
  • Pop: Удаление текущего (верхнего) контроллера из стека, возврат к предыдущему.
    navigationController?.popViewController(animated: true)

Ключевые свойства:

  1. viewControllers: [UIViewController] — массив, представляющий весь стек. Его можно читать и изменять напрямую (например, для массового удаления или вставки).
  2. topViewController: UIViewController? — контроллер, находящийся на вершине стека.
  3. visibleViewController: UIViewController? — контроллер, который в данный момент отображается на экране. Может отличаться от topViewController, если поверх навигационного стека представлен модальный контроллер.

Особенность: Навигационный контроллер автоматически сохраняет и восстанавливает состояние стека при повороте устройства или переходе между состояниями приложения.