Ответ
Экземпляр UIViewController создается в следующих случаях:
1. Программно (из кода):
// Через кастомный инициализатор
let vc1 = MyCustomViewController()
// Через инициализатор для NIB-файла
let vc2 = MyViewController(nibName: "MyView", bundle: nil)
2. Из Storyboard:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ProfileVC") as! ProfileViewController
3. Из SwiftUI (с помощью UIViewControllerRepresentable):
Система создает и управляет экземпляром контроллера в методах makeUIViewController(context:) и updateUIViewController(_:context:).
4. При навигации:
- При вызове
present(_:animated:completion:)для модального показа. - При вызове
pushViewController(_:animated:)вUINavigationController.
Ключевые этапы жизненного цикла:
Создание (init) → Загрузка view (loadView/viewDidLoad) → Появление на экране (viewWillAppear). Контроллеры из Storyboard инициализируются через init(coder:).
Ответ 18+ 🔞
А, ну вот, смотри, опять эти ваши контроллеры, блядь. Как будто без них жизнь кончается. Ну ладно, раз уж спросил, объясню, как эта хуйня на самом деле рождается.
Во-первых, можно просто взять и наколбасить его из кода, как обычный объект. Ну, типа, «дай-ка я тут свой MyCustomViewController сварганю». И всё, он есть.
let vc1 = MyCustomViewController()
Или, если ты ещё из тех, кто с этими старыми NIB-файлами возится (ядерная вошь, ёпта), то через них.
let vc2 = MyViewController(nibName: "MyView", bundle: nil)
Во-вторых, есть способ для любителей красивых картинок — сториборды. Там всё через жопу, с идентификаторами. Находишь в этой куче интерфейса нужную картинку, кричишь ей «эй, ProfileVC, выходи!», и система тебе её материализует.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ProfileVC") as! ProfileViewController
Третий вариант — это когда ты пытаешься подружить этот старый, потный UIKit с новомодным SwiftUI. Там вообще цирк: пишешь какую-то обёртку, UIViewControllerRepresentable, а система уже сама, где-то в своих недрах, в методах makeUIViewController и updateUIViewController, создаёт и дёргает за ниточки твой контроллер. Волшебство, блядь, чистой воды.
Ну и четвёртое — самое обычное дело. Ты жмёшь кнопку, вызываешь present или pushViewController, а система, такая хитрая жопа, сама где-то за кулисами создаёт новый экземпляр и выкатывает его тебе на экран. Ты даже не всегда видишь момент его зачатия.
А потом начинается самое интересное — жизненный цикл. Сначала он просто создаётся (init). Потом начинает грузить свою вьюху — то ли через loadView, то ли сразу в viewDidLoad кричит «я живой!». А потом, когда уже всё готово, скрипит viewWillAppear — типа, щас я вам всем пизды дам, я на экране! И запомни: если контроллер из сториборда, то его инициализируют через init(coder:), а не через твой кастомный инициализатор. Вот такая, блядь, подстава.