Ответ
При первом обращении к свойству view контроллера, если оно nil, система автоматически вызовет метод loadView() для создания иерархии представлений.
Последовательность вызовов:
- Обращение к
view.backgroundColor(например, вinitили доviewDidLoad). - Геттер
viewобнаруживает, что представление не загружено. - Вызывается
loadView(), который создает экземплярUIViewи присваивает его свойствуview. - Сразу после
loadView()вызываетсяviewDidLoad(). - Только теперь выполняется присваивание
backgroundColor = .blue.
Практический пример:
class MyViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
// При первом обращении вызовется loadView(), затем viewDidLoad()
view.backgroundColor = .systemBlue
}
override func loadView() {
print("loadView() вызван — создается view")
view = UIView() // Явное создание view
}
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad() вызван — view создана и готова")
// Здесь backgroundColor уже будет .systemBlue
}
}
Важно: Прямое обращение к view до ее загрузки считается антипаттерном, так как смешивает логику инициализации и жизненного цикла.