> Что такое UIViewController и за что он отвечает в iOS? (iOS, Swift)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Doubletapp

Стек: iOS, Swift

> Пример ответа

Короткий ответ

UIViewController - это фундаментальный класс в UIKit, который управляет иерархией view и реализует жизненный цикл экрана в iOS-приложении. Он отвечает за создание view, обработку событий, навигацию между экранами, адаптацию к изменениям размера и ориентации, а также за связь между данными и их отображением. По сути, это контроллер в паттерне MVC, который координирует работу model и view.

Подробное объяснение

UIViewController - это центральный элемент архитектуры UIKit. Он не является view сам по себе, но управляет одним корневым view (свойство view), которое содержит всю иерархию дочерних элементов. Основные обязанности:

  • Управление жизненным циклом: методы viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear позволяют реагировать на появление и исчезновение экрана.
  • Управление иерархией view: создание, добавление и удаление subview, настройка constraints.
  • Обработка событий: переопределение методов для реагирования на touches, повороты устройства, изменения trait collection.
  • Навигация: работа с UINavigationController, UITabBarController, present/dismiss для перехода между экранами.
  • Управление данными: хранение ссылок на model и подготовка данных для отображения.
  • Адаптация к размеру: методы viewWillTransition(to:with:) и traitCollectionDidChange для поддержки разных размеров и ориентаций.
  • Управление памятью: освобождение ресурсов в deinit и при получении didReceiveMemoryWarning.

Важно понимать, что UIViewController - это не просто "экран", а контейнер логики, который отделяет представление от данных. В современной разработке часто используют composition (например, child view controllers) для декомпозиции сложных экранов.

На практике

На практике UIViewController используется в каждом экране приложения. Типичный сценарий:

  • Создание подкласса UIViewController для каждого экрана (например, LoginViewController, ProfileViewController).
  • Настройка view в viewDidLoad - добавление subviews, установка constraints, настройка делегатов.
  • Реализация навигации через navigationController?.pushViewController или present.
  • Использование @IBOutlet и @IBAction для связи с Interface Builder (или программная верстка).
  • Работа с child view controllers для инкапсуляции логики (например, PageViewController внутри контейнера).

Также важно помнить про UIViewController в связке с UITableView и UICollectionView - часто контроллер выступает как dataSource и delegate для этих view.

Пример кода

SWIFT
import UIKit
final class ProfileViewController: UIViewController {
private let nameLabel = UILabel()
private let avatarImageView = UIImageView()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupSubviews()
configureData()
}
private func setupSubviews() {
view.addSubview(avatarImageView)
view.addSubview(nameLabel)
avatarImageView.translatesAutoresizingMaskIntoConstraints = false
nameLabel.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
avatarImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16),
avatarImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
avatarImageView.widthAnchor.constraint(equalToConstant: 100),
avatarImageView.heightAnchor.constraint(equalToConstant: 100),
nameLabel.topAnchor.constraint(equalTo: avatarImageView.bottomAnchor, constant: 16),
nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
private func configureData() {
nameLabel.text = "Иван Петров"
avatarImageView.image = UIImage(systemName: "person.circle.fill")
}
}

Как отвечать на собеседовании

Начните с краткого определения, затем перечислите ключевые обязанности. Обязательно упомяните жизненный цикл и навигацию. Покажите понимание паттерна MVC и того, что контроллер - это "клей" между данными и view. Если спросят про SwiftUI, отметьте, что там роль контроллера частично берет на себя View и @StateObject. Не углубляйтесь в детали, если не просят - для junior достаточно уверенного перечисления основных функций и пары примеров из практики.

Что проверяет интервьюер

Интервьюер проверяет:

  • базовое понимание архитектуры UIKit;
  • знание жизненного цикла контроллера;
  • умение объяснить, чем контроллер отличается от view;
  • понимание навигации и управления иерархией;
  • способность связать теорию с практикой (например, как вы организуете код на экране).

Типичные ошибки

  • Путаница между UIView и UIViewController - это разные уровни абстракции.
  • Утверждение, что контроллер - это просто "экран" без упоминания управления данными и событиями.
  • Игнорирование жизненного цикла или непонимание, зачем нужны методы viewWillAppear и viewDidAppear.
  • Перегрузка контроллера всей логикой без декомпозиции (это скорее антипаттерн, но упоминание о нем показывает зрелость).
  • Забывают про safeAreaLayoutGuide и адаптивность - для junior это может быть плюсом, если упомянуть.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью