В чем разница UIView и UIViewController в iOS и зачем нужен UIViewController
Что проверяют
Понимаете ли вы разделение ответственности и знаете ли, что даёт контроллер помимо хранения представления.
Как отвечать
UIView это прямоугольная область на экране. Она рисует себя, размещает дочерние представления, обрабатывает касания и участвует в иерархии отображения. Задача одна: показать и принять ввод.
UIViewController управляет экраном целиком: владеет корневым представлением и его иерархией, живёт по своему жизненному циклу и связывает данные с отображением.
Что даёт контроллер и чего нет у представления:
- жизненный цикл:
viewDidLoadдля разовой настройки,viewWillAppearиviewDidAppearдля обновления перед показом,viewWillDisappearдля сохранения и отписки. Без этих точек некуда повесить загрузку данных и подписку; - навигация: контроллер это единица, которой оперируют
UINavigationControllerиUITabBarController, и он же представляет модальные экраны; - реакция на окружение: поворот, изменение размеров, тёмная тема и другие изменения набора признаков приходят именно ему;
- безопасные зоны и отступы разметки, которые он передаёт вниз;
- освобождение ресурсов по предупреждению о нехватке памяти;
- композиция экранов: дочерние контроллеры позволяют собрать сложный экран из самостоятельных частей вместе с их жизненными циклами.
Правило владения одностороннее: контроллер владеет представлением через view, представление о контроллере знать не должно. Ссылка из представления на контроллер это либо цикл удержания, либо архитектурная ошибка, и вместо неё используют делегирование или замыкание.
Отсюда типичная проблема «раздутого контроллера»: в него стекается всё, потому что он единственный, у кого есть жизненный цикл. Лечится выносом логики в модель представления, разбиением на дочерние контроллеры и переносом источника данных таблицы в отдельный объект.
Где спотыкаются
Загружают данные в viewDidLoad, хотя обновление нужно при каждом показе, и наоборот.
Держат сильную ссылку на контроллер из представления.
Обращаются к view до его загрузки и вызывают преждевременное создание иерархии.
Складывают в один контроллер сеть, разбор данных и разметку.