Когда создается экземпляр UIViewController в iOS?

Ответ

Экземпляр 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:), а не через твой кастомный инициализатор. Вот такая, блядь, подстава.