> Что такое 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.
Пример кода
SWIFTimport UIKitfinal class ProfileViewController: UIViewController {private let nameLabel = UILabel()private let avatarImageView = UIImageView()override func viewDidLoad() {super.viewDidLoad()view.backgroundColor = .whitesetupSubviews()configureData()}private func setupSubviews() {view.addSubview(avatarImageView)view.addSubview(nameLabel)avatarImageView.translatesAutoresizingMaskIntoConstraints = falsenameLabel.translatesAutoresizingMaskIntoConstraints = falseNSLayoutConstraint.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 это может быть плюсом, если упомянуть.
> Похожие задачи по mobile
В чем разница между run loop и dispatch queue
Какие проблемы есть у Service Locator паттерна
С какими основными свойствами работают у UIView в iOS?
Будет ли ошибка при передаче non-escaping closure дальше и почему?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью