Как и когда происходит инициализация свойства `view` у UIViewController?

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

Ответ

Свойство view инициализируется лениво в момент первого обращения к нему (геттеру). Этот процесс называется загрузкой представления.

Жизненный цикл загрузки view:

  1. Запрос view: Код (система или разработчик) впервые обращается к self.view.
  2. Вызов loadView(): Если view равно nil, система вызывает этот метод.
  3. Создание view в loadView():
    • По умолчанию: Метод создает пустой объект UIView.
    • Из Storyboard/XIB: Метод загружает иерархию из файла.
    • Кастомная реализация: Вы можете переопределить loadView(), чтобы создать представление вручную.
  4. Присвоение: Созданное представление присваивается свойству view.
  5. Вызов viewDidLoad(): Сразу после загрузки. Идеальное место для начальной настройки.

Важные нюансы:

  • Не вызывайте super.loadView() при ручном создании view, иначе вы создадите два представления.
  • Все outlet'ы гарантированно установлены к моменту вызова viewDidLoad().
  • Используйте viewIfLoaded для безопасной проверки, загружено ли представление.

Пример переопределения loadView():

class CustomViewController: UIViewController {
    override func loadView() {
        // 1. Создаем кастомное view вручную
        let customView = CustomView(frame: UIScreen.main.bounds)
        customView.backgroundColor = .systemBackground
        // 2. НЕ вызываем super.loadView()
        // 3. Присваиваем свойству view
        self.view = customView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Теперь self.view — это наш CustomView
        print("View is loaded: (type(of: self.view))") // CustomView
    }
}