viewDidLoad в iOS: що це, призначення та приклади коду

Автор: IT Sectr Опубліковано: 2026-03-05 Час читання: 8 хв

viewDidLoad — це перший метод, який UIKit викликає після завантаження View UIViewController в пам’ять. За даними Apple Developer Documentation, цей метод викликається рівно один раз за весь час існування контролера. viewDidLoad — основне місце для початкового налаштування інтерфейсу, реєстрації комірок та ініціалізації даних.

Головне

  • viewDidLoad викликається один раз після завантаження View в пам’ять
  • super.viewDidLoad обов’язковий — без нього Lifecycle ламається
  • У цьому методі налаштовують UI, реєструють комірки та створюють data source
  • Не викликається повторно при поверненні на екран — використовуйте viewWillAppear
  • Підходить для одноразових операцій та підписки на постійні сповіщення

Що таке viewDidLoad

viewDidLoad — це метод екземпляра UIViewController, який UIKit викликає відразу після того, як View контролера була завантажена в оперативну пам’ять. До цього моменту всі IBOutlet-властивості вже з’єднані з елементами інтерфейсу, але View ще не додана в ієрархію вікон і не видна користувачеві. Розробник перевизначає цей метод, щоб виконати початкове налаштування екрана.

Метод є частиною ViewController Lifecycle і слідує відразу після loadView, якщо View створюється програмно, або після завантаження з Storyboard. У типовому проекті viewDidLoad — найчастіше перевизначуваний метод UIViewController, оскільки він надає безпечну точку для роботи з subviews, які вже існують і готові до налаштування.

Важлива деталь: на момент виклику viewDidLoad розміри View ще не відповідають фінальним — Auto Layout не завершив проходів, і frame може відрізнятися від очікуваного. Для розрахунків, які залежать від розмірів, використовують viewDidLayoutSubviews.

Коли викликається viewDidLoad

Таймінг виклику viewDidLoad залежить від того, як ініціалізується контролер. У більшості випадків UIKit викликає цей метод автоматично при першому зверненні до властивості view контролера — це називається lazy-loading механізмом UIViewController.

При першому відкритті екрана

Коли NavigationController або TabBarController вперше показує ваш екран, UIKit перевіряє, чи завантажена View. Якщо ні — викликається loadView (або завантаження з Storyboard), після чого негайно спрацьовує viewDidLoad. Це стандартний сценарій, і він відбувається одноразово для кожного екземпляра контролера.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    print("View завантажено — можна налаштовувати інтерфейс")
    setupUI()
    configureTableView()
}

При поверненні на існуючий екран

viewDidLoad не викликається повторно при поверненні на екран через back button або dismiss. Якщо ваша логіка залежить від того, що екран з’являється знову — розміщуйте її в viewWillAppear. Це одна з найчастіших концептуальних помилок: розробники очікують, що viewDidLoad спрацює при кожному показі, але UIKit викликає його всього один раз.

При forcedViewLoad

Іноді розробники примусово викликають view у контролера, щоб ініціювати завантаження заздалегідь: let _ = controller.view. Це форсує виклик loadView та viewDidLoad до того, як контролер з’явиться на екрані. Такий прийом використовують, коли потрібно підготувати View заздалегідь для плавного переходу.

Що робити в viewDidLoad

viewDidLoad призначений для одноразових операцій налаштування, які не залежать від того, чи видимий екран. Правильне використання цього методу — запорука чистої архітектури та передбачуваної поведінки контролера.

Налаштування UI-компонентів

У viewDidLoad реєструють nib-файли та класи для UITableView та UICollectionView, налаштовують делегатів, задають початкові значення властивостей UI-елементів. Оскільки всі IBOutlet на цей момент уже зв’язані, можна безпечно звертатися до label.text, imageView.image та інших властивостей subviews.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(
        CustomCell.self,
        forCellReuseIdentifier: CustomCell.identifier
    )
    title = "Головний екран"
}

Ініціалізація даних та підписки

Тут створюють viewModel, ініціалізують data source масивами, підписуються на сповіщення, які повинні діяти весь час життя контролера. Наприклад, підписка на UIApplication.willEnterForegroundNotification для оновлення даних при поверненні з фону — правильний кандидат для viewDidLoad. ViewModel у сучасній iOS-архітектурі виступає сполучною ланкою між контролером та бізнес-логікою, і її ініціалізація саме в viewDidLoad забезпечує готовність даних до моменту першої появи екрана.

Особливу увагу приділіть налаштуванню data source для таблиць і колекцій. Якщо ваша таблиця використовує UIFetchedResultsController або NSFetchedResultsController з Core Data, ініціалізуйте fetch request і делегат у viewDidLoad. Це гарантує, що при першій появі екрана таблиця вже буде заповнена даними без додаткових запитів.

Налаштування навігації

У viewDidLoad конфігурують кнопки NavigationBar, налаштовують large title, додають search controller та встановлюють кнопки edit/done. Ці елементи рідко змінюються при повторних показах екрана, тому їх ініціалізація тут оптимальна.

Чого не варто робити в viewDidLoad

Не всі операції доречні в viewDidLoad. Деякі дії, поміщені в цей метод, призводять до надмірного споживання пам’яті, неправильної поведінки або багів при повторних показах екрана.

Уникайте запуску мережевих запитів, результат яких впливає лише на UI. Якщо запит завершиться до появи екрана, користувач не побачить результат, а якщо після — дані можуть застаріти. Ініціюйте завантаження в viewDidLoad, але оновлюйте UI в viewWillAppear.

Не робіть у viewDidLoad операцій, залежних від розмірів та положення View. На момент виклику Auto Layout не завершив проходи, і frame може бути не фінальним. Для розрахунків використовуйте viewDidLayoutSubviews або перевизначте updateViewConstraints.

Не підписуйтеся на сповіщення, які діють лише коли екран видимий. Клавіатурні сповіщення, сповіщення про зміну вмісту дочірніх контролерів — підписуйтеся на них у viewWillAppear і відписуйтеся в viewDidDisappear, щоб уникнути зайвих викликів та витоків.

Не викликайте методи, які потребують видимого екрана. Наприклад, спроба показати UIAlertController з viewDidLoad призведе до помилки, оскільки View контролера ще не додана в ієрархію вікон. Будь-які UI-операції, залежні від window або presentedViewController, повинні виконуватися лише після появи екрана.

Не ініціалізуйте важкі ресурси без необхідності. Якщо на екран заходять рідко або дані відображаються не одразу, відкладіть створення ресурсоємних об’єктів до моменту, коли вони дійсно знадобляться. Lazy-ініціалізація властивостей у Swift — вбудований механізм для вирішення цього завдання: властивість із модифікатором lazy буде створена лише при першому зверненні до неї, що економить пам’ять та прискорює завантаження екрана.

Не використовуйте viewDidLoad для операцій, які повинні виконуватися при кожній появі екрана. Це найфундаментальніша помилка: початківці часто розміщують логіку оновлення даних у viewDidLoad і дивуються, що при поверненні з іншого екрана таблиця не перезавантажується. Якщо операція повинна повторюватися при кожному показі — використовуйте viewWillAppear. Якщо повинна виконатися один раз за час життя — viewDidLoad. Запам’ятайте це просте правило, щоб уникнути більшості проблем із життєвим циклом UIViewController.

Приклади коду з viewDidLoad

Розглянемо три практичних приклади, що демонструють правильне використання viewDidLoad у реальних проектах. Кожен приклад вирішує конкретне завдання налаштування екрана.

Приклад 1: налаштування колекції з кастомними комірками

swift
override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.register(
        PhotoCell.self,
        forCellWithReuseIdentifier: PhotoCell.reuseId
    )
    collectionView.register(
        HeaderView.self,
        forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
        withReuseIdentifier: HeaderView.reuseId
    )
    viewModel.delegate = self
    viewModel.fetchInitialPage()
}

Приклад 2: налаштування констрейнтів програмно

swift
override func viewDidLoad() {
    super.viewDidLoad()
    let label = UILabel()
    label.text = "Привіт, світе!"
    label.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(label)

    NSLayoutConstraint.activate([
        label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    ])
}

Приклад 3: налаштування пустого стану та лоадера

У viewDidLoad також налаштовують елементи, що відображаються за відсутності даних: пустий стан, лоадер, placeholder. Ці компоненти створюються один раз і перевикористовуються при кожній появі екрана. Приховування або показ цих елементів керується в viewWillAppear залежно від актуальних даних.

swift
override func viewDidLoad() {
    super.viewDidLoad()
    emptyStateLabel = UILabel()
    emptyStateLabel.text = "Немає даних"
    emptyStateLabel.textAlignment = .center
    emptyStateLabel.isHidden = true
    view.addSubview(emptyStateLabel)

    activityIndicator = UIActivityIndicatorView(style: .medium)
    activityIndicator.hidesWhenStopped = true
    view.addSubview(activityIndicator)
}

Приклад 4: підписка на сповіщення додатка

swift
override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(handleEnterForeground),
        name: UIApplication.willEnterForegroundNotification,
        object: nil
    )
}

@objc private func handleEnterForeground() {
    refreshContent()
}

Часті запитання

Чи може viewDidLoad викликатися більше одного разу?

У нормальних умовах ні — UIKit викликає viewDidLoad один раз після завантаження View в пам’ять. Якщо контролер знищується і створюється заново, viewDidLoad спрацює для нового екземпляра.

Чи потрібно викликати super.viewDidLoad?

Так, обов’язково. Виклик super.viewDidLoad гарантує, що UIKit виконає внутрішнє налаштування, необхідне для коректної роботи Lifecycle. Завжди викликайте super першим ділом всередині методу.

У чому різниця між viewDidLoad та viewWillAppear?

viewDidLoad викликається один раз при завантаженні View. viewWillAppear викликається щоразу перед появою екрана. Перший — для одноразового налаштування, другий — для оновлення даних і стану.

Чи можна робити в viewDidLoad важкі операції?

Важкі синхронні операції в viewDidLoad блокують main thread і затримують появу екрана. Асинхронні завантаження допустимі, але оновлювати UI по їх завершенні потрібно з урахуванням, що екран може бути вже прихований.

Як викликати viewDidLoad примусово?

Напряму viewDidLoad викликати не можна — його викликає UIKit. Щоб форсувати завантаження View, зверніться до властивості controller.view. Це запустить loadView і viewDidLoad автоматично.

Підсумки

  • viewDidLoad — метод одноразового налаштування UIViewController після завантаження View в пам’ять
  • Викликається один раз за час життя контролера при першому зверненні до View
  • Підходить для реєстрації комірок, налаштування делегатів, ініціалізації viewModel
  • Завжди викликайте super.viewDidLoad для коректної роботи Lifecycle
  • Не використовуйте viewDidLoad для операцій, залежних від розмірів View
  • Для оновлення даних при кожній появі використовуйте viewWillAppear
  • Підписка на постійні сповіщення — доречна, на тимчасові — в viewWillAppear

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також