Жизненный цикл UIViewController
Жизненный цикл контроллера начинает с создания. В 99% случаях создание происходит в storyboard, и «за сценой» происходит инициализация, а потом:
1. Подготовка к переходу в контроллер.
Другой контроллер приготавливается к переходу в наш. При этой подготовке outlet свойства еще не установлены. К ним обращаться нельзя!
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
2. Установка outlet свойств.
@IBOutlet weak var pannableView: UIView {
}
3. Появление на экране и уход с экрана.
Это самое отличное место чтобы выполнить большинство установок для контроллера. Посудите сами — в подготовке все нужные данные переданы, свойства установлены — самое время что-то настроить.
override func viewDidLoad() {
super.viewDidLoad() // всегда вызываем метод жизненного цикла у суперкласса
// настраиваем наш MVC
}
```
Далее появления на экране: прямо перед появлением view на экране мы получаем уведомление вызовом
```swift
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
}
```
Далее, сразу после появления view на экране вызывается метод
```swift
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
}
```
Если view ушло с экрана вызываются методы
```swift
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
}
4. Изменение геометрии (поворот, изменение границ).
Система знает когда поменялись границы нашего view. И она вызывает методы.
super.viewWillLayoutSubviews()
}
// Autolayout происходит тут - между двумя этими методами
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
```
Нужно понимать, что это не функция ВьюВКонтроллереИзменилаГраницы(). Расположение всех элементов пользовательского интерфейса задаются параметрами Autolayout , и эти два метода вызываются чтобы убедится, что расстановка выполнена правильно (до начала расстановки и сразу после нее)
Обработка поворота экрана обрабатывается автоматически, и задается в настройках приложения. Однако если нужно самостоятельно обработать анимацию при повороте, то можно использовать следующий метод, который также является частью жизненного цикла ViewController:
```swift
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator:
UIViewControllerTransitionCoordinator)
5. Ситуация с недостатком памяти устройства.
Ну и в очень редких случаях система может послать сообщение о нехватке памяти.
override func didReceiveMemoryWarning()
```
Тут можно попробовать обнулить объекты, которые не используются.
Oct. 14, 2023, Источник
Жизненный цикл `UIViewController` описывает последовательность событий, происходящих с момента создания до уничтожения контроллера представления. Понимание этого жизненного цикла критически важно для правильного управления загрузкой, отображением, обновлением и уничтожением представлений в iOS-приложении. Вот ключевые этапы:
1. Инициализация
Жизненный цикл начинается с инициализации. Обычно это происходит либо через инициализатор `init(coder:)` при загрузке контроллера из storyboard, либо через `init(nibName:bundle:)`, если контроллер создаётся программно.
2. Загрузка представления
- `loadView`: Вызывается, когда представление контроллера загружается в память. Этот метод создаёт и назначает основное view контроллера, обычно не требуется его переопределять, если вы используете storyboard или xib-файлы.
- `viewDidLoad`: Вызывается после загрузки основного представления контроллера в память. Здесь вы обычно выполняете начальную настройку интерфейса, которая должна произойти один раз за время жизни контроллера.
3. Появление представления
- `viewWillAppear(_:)`: Вызывается непосредственно перед тем, как представление контроллера станет видимым пользователю. Здесь можно настроить интерфейс или данные, которые должны обновляться каждый раз перед отображением представления.
- `viewDidAppear(_:)`: Вызывается после того, как представление контроллера стало видимым пользователю. Здесь можно начать анимации, запустить процессы, которые должны происходить после того, как представление стало видимым.
4. Обновление макета
- `viewWillLayoutSubviews`: Вызывается перед тем, как контроллер представления расположит свои подпредставления. Это хорошее место, чтобы изменить размер или положение подпредставлений вручную.
- `viewDidLayoutSubviews`: Вызывается после того, как контроллер представления расположил свои подпредставления. Здесь можно выполнить дополнительные настройки макета, зависящие от размеров подпредставлений.
5. Исчезновение представления
- `viewWillDisappear(_:)`: Вызывается непосредственно перед тем, как представление контроллера будет удалено с экрана. Используется для остановки анимаций или тяжёлых задач, сохранения состояния и так далее.
- `viewDidDisappear(_:)`: Вызывается после того, как представление контроллера исчезло с экрана. Здесь можно очистить ресурсы, связанные с отображением представления.
6. Уничтожение контроллера
- `deinit`: Вызывается непосредственно перед тем, как контроллер представления будет уничтожен. Это место для очистки и освобождения ресурсов.
Понимание каждого из этих этапов жизненного цикла позволяет разработчику правильно управлять ресурсами, настраивать интерфейс и реагировать на изменения, связанные с появлением и исчезновением представлений.
April 10, 2024, easyoffer