Содержание
Если вы вызываете инициализатор уUIView - система сразу выделит память. У контроллера тоже есть вью, но
Система ждет причину создать вью, мы разберем как это работает. Концепция жизненного цикла строится вокруг этой особенности. Просто держите в уме, что вью создается по необходимости.
Рассмотрим базовый
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
Ещё есть инициализатор без параметров
На этом этапе контроллер инициализирует проперти и отрабатывает тело инициализатора. Вью не загружается, аутлеты не активны. В инициализаторе с nib сохраняется только имя файла, сам файл не подгружается. Подробнее про загрузку вью дальше.
Разработчик презентует контроллер. Для системы это повод выделить память и загрузить вью. Мы можем следить за процессом и даже вмешаться. Глянем какие методы доступны:
override func loadView() {}
Метод
Второй метод легендарен, как Стив Джобс. Он вызывается когда вью закончила загрузку.
override viewDidLoad() {
super.viewDidLoad()
}
Разработчики не просто так делают настройку контроллера и вьюх в методе
Проект от такого не крашнется, но элементы интерфейса расходуют память - нет смысла тратить её раньше, чем нужно. Лучше делать это по необходимости.
Раньше я делал проперти-вьюхи контроллера просто создавая их:
class ViewController: UIViewController {
let redView = UIView()
}
Проперти инициализируется вместе с контроллером, а значит память для вью выделится сразу. Чтобы отложить это до требования, нужно пометить проперти как
В методе
Хочу остановиться на
Если модальный контроллер закрыть, вью выгрузится из памяти, но объект контроллера будет жив. Аутлеты здесь активны, но уже не имеют смысла - их можно ресетить. Если показать контроллер еще раз - вью снова загрузится. Если система выгрузила вью, значит была причина. Не нужно обращаться к корневой вью в этом методе - это загрузит вью.
Не нужно срочно брать внеурочные и все выходные переделывать вашу VPN-ку. Ничего не сломается,
Появление контроллера начинается с метода
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
Появление контроллера в модальном окне, или переход в
Оба метода в связке. Тут делать настройку не нужно, но можно спрятать/показать вьюхи или добавить несложное поведение. В методе
Есть методы, которые сообщают что вью пропадает с экрана. Наглядная схема:

Обратите внимание на пару антагонистов
Методы лейаута, аналогично методам выше, подвязаны к жизненному циклу вьюхи. Доступно 3 метода:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
Первый метод вызывается до
Есть отдельный метод про изменение размеров вью. Это не обязательно поворот устройства, хотя он тоже:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
}
После будут вызваны методы
Если вы не очистите объекты, из-за которых это происходит, iOS принудительно крашнет приложение.
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
Другие туториалы
Рассмотрим уровни доступа и как обезопасить свой код с ними.
В этой статье я покажу как добавить свою View в Xcode Library с помощью LibraryContentProvider.
Знакомимся с модификатором
В iOS 15 появились sheet-контроллеры. Их можно перетаскивать с изменением высоты. Вы встречали эти контроллеры в приложениях «Карты» и «Акции».
В telegram-канале приходят уведомления о новых туториалах. В чате для iOS разработчиков ответят на вопросы.