Жизненный цикл 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