View Controller Lifecycle, жизненный цикл View Controller
Итак жизненный цикл контроллера начинает с создания. Как я уже писал раньше — в 99% случаях создание происходит в storyboard, и «за сценой» происходит инициализация
А что потом? А вот что:
- Подготовка к переходу в контроллер
- Установка outlet свойств
- Появление на экране и уход с экрана
- Изменение геометрии (поворот, изменение границ)
- Ситуация с недостатком пямити устройства
Первый пункт: другой контроллер приготавливается к переходу в наш. При этой подготовке 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, чтобы можно было использовать ее как шпаргалку.
Спасибо, хорошо структурировано.
А следущая часть есть?
Если Вы спрашиваете про мою статью то да, вот она
http://proswift.ru/zhiznennyj-cikl-view-controller-shpargalka/
Если вы что-то другое имеете ввиду, расскажите поподробней, что Вы хотите видеть в следующей части.