Что такое метод viewDidLoad() в UIViewController?

«Что такое метод viewDidLoad() в UIViewController?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

viewDidLoad() — это метод жизненного цикла контроллера представления (UIViewController), который вызывается один раз после того, как его корневое представление (view) было загружено в память, но еще до того, как оно появится на экране.

Основное назначение: Начальная, одноразовая настройка контроллера.

Что обычно делают в viewDidLoad():

  1. Настройка пользовательского интерфейса: Добавление subviews, установка их свойств.
  2. Инициализация данных: Загрузка начальных данных из модели, настройка объектов.
  3. Настройка навигации: Установка заголовка, кнопок на панели навигации.

Пример:

class ProfileViewController: UIViewController {
    private let nameLabel = UILabel()
    private var userProfile: Profile?

    override func viewDidLoad() {
        super.viewDidLoad() // Всегда вызывайте super

        // 1. Настройка внешнего вида view
        view.backgroundColor = .systemBackground

        // 2. Настройка и добавление элементов UI
        nameLabel.text = "Загрузка..."
        nameLabel.textAlignment = .center
        nameLabel.frame = CGRect(x: 20, y: 100, width: view.bounds.width - 40, height: 30)
        view.addSubview(nameLabel)

        // 3. Начальная загрузка данных
        loadInitialData()
    }

    private func loadInitialData() {
        userProfile = DataManager.shared.loadProfile()
        nameLabel.text = userProfile?.name
    }
}

Важные ограничения и замечания:

  • Размеры view: В viewDidLoad() bounds корневого view еще не окончательные (они могут быть установлены системой или сторибордом позже). Не рассчитывайте на финальную геометрию для сложного лейаута. Используйте viewDidLayoutSubviews() для работы, зависящей от финальных размеров.
  • Однократность: Метод вызывается один раз за время жизни контроллера, если только его view не была выгружена из памяти при нехватке ресурсов (и затем загружена снова).
  • Не для обновлений: Для обновления данных при каждом появлении экрана используйте viewWillAppear(_:).