В каком методе жизненного цикла UIViewController следует подменять view?

Ответ

loadView() — правильное место для кастомной инициализации view контроллера.

Пример реализации:

class CustomViewController: UIViewController {
    override func loadView() {
        // Создаем кастомную view
        let customView = CustomView()
        customView.backgroundColor = .systemBackground
        customView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        // Устанавливаем как основную view контроллера
        self.view = customView
    }
}

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

  1. Не вызывайте super.loadView() если полностью заменяете view:
    
    // Правильно:
    override func loadView() {
    self.view = CustomView()
    }

// Неправильно: override func loadView() { super.loadView() // Создает стандартную UIView self.view = CustomView() // Лишняя работа }


2. **Проверка после установки:**
```swift
override func loadView() {
    let customView = CustomView()
    self.view = customView
    assert(self.view != nil, "View must not be nil after loadView")
}
  1. Когда НЕ переопределять loadView():

    • Для контроллеров из Storyboard/XIB
    • Когда используется init(nibName:bundle:) с существующим nib-файлом
  2. Альтернативный подход — установка в viewDidLoad() (менее предпочтительно):

    // Работает, но view уже создана системой
    override func viewDidLoad() {
    super.viewDidLoad()
    let customView = CustomView(frame: self.view.bounds)
    self.view = customView // Замена существующей view
    }

Порядок вызова методов:

  1. init() → 2. loadView() → 3. viewDidLoad() → 4. viewWillAppear()

Ответ 18+ 🔞

Давай разберем эту тему про loadView(), а то тут, блядь, столько народу наступает на одни и те же грабли, что хоть саперов обучай.

Вот смотри, loadView() — это как раз тот самый момент, когда контроллеру нужно родить себе вьюху. Не раньше, не позже. Система ему говорит: «Слушай, дружок, пора бы уже обзавестись своим view-проперти, а то оно пока nil». И вот тут ты можешь впендюрить свою кастомную вьюху, а не ту стандартную серую херню, которую система по умолчанию подсовывает.

Вот как это выглядит в коде, если ты не лох:

class CustomViewController: UIViewController {
    override func loadView() {
        // Создаем кастомную view
        let customView = CustomView()
        customView.backgroundColor = .systemBackground
        customView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        // Устанавливаем как основную view контроллера
        self.view = customView
    }
}

А теперь, блядь, внимание, важные моменты, где все обычно ебутся:

  1. Не вызывай super.loadView() как попугай, если сам всё делаешь. Это же не ритуал какой-то, ёпта!

    // Правильно — ты сам себе хозяин:
    override func loadView() {
        self.view = CustomView()
    }
    
    // Неправильно — зачем зря систему дергать, она тебе лишнюю вьюху создаст:
    override func loadView() {
        super.loadView() // А система тут уже наваяла UIView()
        self.view = CustomView() // А ты её выкидываешь! Зачем?!
    }
  2. Проверь, не обосрался ли ты случайно и вьюха всё-таки проставилась. Мало ли.

    override func loadView() {
        let customView = CustomView()
        self.view = customView
        assert(self.view != nil, "View must not be nil after loadView") // На всякий пожарный
    }
  3. А когда НЕ надо лезть в loadView()? Да когда и так всё готово, ядрёна вошь!

    • Если контроллер из Storyboard или XIB — там всё само подцепится.
    • Если ты используешь init(nibName:bundle:) и у тебя есть этот самый nib-файл. Система сама всё загрузит.
  4. Альтернатива для ленивых (или для тех, кто поздно спохватился) — сделать всё в viewDidLoad(). Но это, блядь, как приехать на стройку, когда фундамент уже залили, и пытаться его поменять. Работает, но криво.

    // Работает, но view уже создана системой (та самая серая херня)
    override func viewDidLoad() {
        super.viewDidLoad()
        let customView = CustomView(frame: self.view.bounds)
        self.view = customView // Замена существующей view — лишняя работа!
    }

И запомни раз и навсегда порядок, чтобы не путаться, как мартышлюшка:

  1. init() — родился контроллер.
  2. loadView()ВОТ ТУТ он должен создать себе вьюху. Идеальное место для кастомной.
  3. viewDidLoad() — вьюха создана, можно её настраивать (цвета, кнопки, лейблы).
  4. viewWillAppear() — скоро покажемся на экране.

Вот и вся магия. Главное — не выебывайся и делай в нужном месте.