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

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

Ответ

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()