View Controller Lifecycle, жизненный цикл View Controller

Итак жизненный цикл контроллера начинает с создания. Как я уже писал раньше  — в 99% случаях создание происходит в storyboard, и «за сценой» происходит инициализация

А что потом? А вот что:

  1. Подготовка  к переходу в контроллер
  2. Установка outlet свойств
  3. Появление на экране и уход с экрана
  4. Изменение геометрии (поворот, изменение границ)
  5. Ситуация с недостатком пямити устройства

Первый пункт: другой контроллер приготавливается к переходу в наш. При этой подготовке outlet свойства еще не установлены. К ним обращаться нельзя!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

Далее все outlet свойства устанавливаются.

@IBOutlet weak var pannableView: UIView {
      didSet {
         // тут можно поймать это событие в жизненном цикле
      }
}

После инициализации и установки outlet свойств система вызывает viewDidLoad. Это самое отличное место чтобы выполнить большинство установок для контроллера. Посудите сами — в подготовке все нужные данные переданы, свойства установлены — самое время что-то настроить.

override func viewDidLoad() {
super.viewDidLoad() // всегда вызываем метод жизненного цикла у суперкласса
 // настраиваем наш MVC
}

Геометрия (границы) еще не установлены. Нельзя здесь обрабатывать значения геометрии

Далее появления на экране: прямо перед появлением  view на экране мы получаем уведомление вызовом 

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
    }

 Загрузка происходит единожды, а вот появление и уход с экрана — многократно. Например в UISplitViewController — на iPad в портретном режиме не видно master, но он есть, а при повороте экрана master появляется слева. Еще в данный момент уже установлена геометрия. Т.е.  границы

vc.view.bounds

установлены, но с этими параметрами удобнее работать позднее…

Далее, сразу после появления view на экране вызывается метод

    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
    }


Если view  ушло с экрана вызываются методы

    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
    }
    
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
    }

Тут можно почистить что-нибудь на экране, но не сильно напрасными методами. Если то что здесь запустить будет стоить много ресурсов — приложение будет тормозить.

Геометрия. Система знает когда поменялись границы нашего view. И она вызывает методы

    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
    }
    
   //  Autolayout происходит тут - между двумя этими методами 

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    }

Нужно понимать, что это не функция ВьюВКонтроллереИзменилаГраницы(). Расположение всех элементов пользовательского интерфейса задаются параметрами   Autolayout (понимание которого приходит только если его делать снова и снова), и эти два метода вызываются чтобы убедится, что расстановка выполнена правильно (до начала расстановки и сразу после нее)

Обработка поворота экрана обрабатывается автоматически, и задается в настройках приложения. Однако если нужно самостоятельно обработать анимацию при повороте, то можно использовать следующий метод, который также является частью жизненного цикла  ViewController:

//
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

Ну и в очень редких случаях система может послать сообщение о нехватке памяти

//
override func didReceiveMemoryWarning()

Тут можно попробовать обнулить объекты, которые не используются.

 

Нужно сказать еще про один метод — awakeFromNib — он не является частью ViewController Lifecycle, ну нужно понимать что он вызывается сразу после инициализации, перед подготовкой перехода у контроллера, который задан с помощью storyboard.   Это хорошее место чтобы указать класс делегата для, допустим, UISplitViewController.

В этой статье все описано подробно, а в следующей я просто укажу последовательность методов ViewController Lifecycle, чтобы можно было использовать ее как шпаргалку.

2 Comments on “View Controller Lifecycle, жизненный цикл View Controller

Добавить комментарий для Максим Отменить ответ

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.