В чем разница между жизненным циклом контроллера представления и жизненным циклом представления в iOS?
Читая несколько уроков и книг по разработке под iOS, я часто сталкиваюсь с терминами: UIViewController
жизненный цикл и UIView
жизненный цикл. Я заинтересован: есть ли реальная разница между этими двумя терминами? Просматривая документы Apple, я обнаружил, что такие методы, как viewDidAppear
или же loadView
является частью жизненного цикла контроллера представления, но я думаю, что более правильно называть их жизненным циклом представления и такими методами, как initWithNibName
или же dealloc
как жизненный цикл контроллера. Или нет такого разделения, и когда кто-то говорит о взгляде на жизненный цикл, он на самом деле имеет в виду UIViewController
жизненный цикл?
4 ответа
Вся ваша путаница исчезнет, как только вы полностью поймете разницу между двумя классами и укорените ее в своем уме (на практике)
UIViewController - класс, который не имеет пользовательского интерфейса сам по себе (хотя и не совсем верно, см. Корневое представление), его цель - управлять представлениями и выполнять некоторые связанные вещи. Это похоже на полицейского или контролера трафика, контролирующего других. (Просмотры). Большую часть времени вы создаете свой собственный подкласс UIViewController, и этот класс имеет тенденцию быть довольно тяжелым по функциональности, такой как
- обработка логических правил, когда показать, что посмотреть
- подключение к слою модели (данные и факты о проблеме, которую решает ваше приложение)
- взаимодействуя с другими контроллерами,
UIView - класс, представляющий прямоугольную область, которая может быть сильно визуально изменена, но самым важным является то, что она видна на экране и может иметь подпредставления, которые также UIViews
, Представления организованы в иерархии представлений. Большую часть времени вы настраиваете свое представление так, чтобы оно
- визуально приятный
- обрабатывает его подпредставления через autolayout
- представляет особый тип визуальной информации, который вам часто нужно разделить на подклассы для более определенного класса представления, такого как метки, тексты, кнопки и т. д.
Один момент, который сбивает с толку новичков, состоит в том, что каждый контроллер представления имеет одно корневое представление, свойство, которое содержит UIView
пример. Часто вы можете потеряться в том, обсуждается ли это корневое представление или контроллер представления. В причинно-следственной связи между разработчиками два слова иногда используются взаимозаменяемо.
Оба контроллера и представления имеют жизненный цикл, но вы не должны путать их.
Жизненный цикл ViewController - это то, что происходит с самим контроллером, как будто он просыпается из nib-файла или получает предупреждение о нехватке памяти, но в основном о том, как его корневое представление оживает, как оно исчезает и умирает.
View Lifecycle рассказывает о том, как представление размещает свои подпредставления и как оно отображает их содержимое.
Мне нравятся визуальные аналогии. Просто представьте полицейского с множеством разноцветных бумажных прямоугольников. Полицейский является контролером, и он говорит, что (взгляды) показывается и когда на экране.
Контроллер и представление являются абстракциями, которые являются частью (Model View Controller) архитектурного шаблона MVC. Я рекомендую вам изучить это немедленно, чтобы проблема путаницы в жизненном цикле была еще лучше прояснена.
Оба понятия разные, поэтому имеют разные жизненные циклы.
UIViewController
ViewController - это контроллер в архитектуре MVC. Поэтому он отвечает за координацию информации между моделью (вашими данными) и вашими представлениями. UIViewControllers
координировать UIViews и являются частью навигации между экранами (pushViewController
, presentViewController
). Поэтому необходимо знать, когда он появится на экране.
UIViewController
имеет очень специфический жизненный цикл, и у него есть методы, которые могут быть расширены, которые являются частью этого жизненного цикла. Примеры этих методов:
viewDidLoad
, viewWillAppear
, viewDidAppear
, viewWillDisappear
, viewDidDisappear
Посмотреть
Вид, с другой стороны, не должен беспокоиться, когда он должен появиться на экране. Поэтому у него совершенно другой жизненный цикл:
awakeFromNib
, willMoveToSuperView
, didMoveToSuperView
Эти методы обычно вызываются в последовательности UIViewController's
жизненный цикл Поэтому обычно UIView
реагирует на изменения, и люди не считают, что у них есть жизненный цикл самостоятельно.
Жизненный цикл ViewController имеет смысл только тогда, когда класс расширяется UIViewController
в то время как UIView
Жизненный цикл имеет смысл только когда расширяется UIView
,
В большинстве случаев, когда люди говорят о жизненном цикле, они говорят о UIViewController
жизненный цикл, так как представление обычно реагирует на изменения. Два примера этих изменений: представление изменило свой размер, изменило своего родителя.
Добавим к этим ответам и уделим немного больше внимания вашим точным вопросам:
Я заинтересован: есть ли реальная разница между этими двумя терминами?
Да, между ними есть различие, но в контексте, где вы имеете дело с UIViewController's
корень UIView
они связаны между собой.
Просматривая документы Apple, я обнаружил, что такие методы, как viewDidAppear или loadView, являются частью жизненного цикла контроллера представления, но я думаю, что более правильно называть их жизненным циклом представления, а такие методы, как initWithNibName или dealloc - жизненным циклом контроллера.
И вот почему они связаны:
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear:
Все они находятся в разделе " Отвечать на события просмотра" в документации. Так что это обратные вызовы от UIView
к UIViewController
рассказывая о своем состоянии. И хотя:
loadView
viewDidLoad
Не находятся в одном разделе (в документации), это UIView
запрашивать / рассказывать UIViewController
о его нынешнем состоянии. И у вас есть другие примеры этих взаимодействий, например:
viewWillLayoutSubviews
viewDidLayoutSubviews
В некотором смысле (и в контексте вашего вопроса) общий ответ таков: да, это два разных жизненных цикла с разными особенностями, но они связаны друг с другом. Примером, где они не имеют прямого отношения, будет UIViewController
"s didReceiveMemoryWarning
, (Я говорю прямо, потому что косвенно, это может быть UIViewController
корень UIView
виновник).
Most of the lifecycle is handled automatically by the
system and no need for calling some methods like parent and child view
controllers relationship
Here are the mentioned lifecycle methods for UIView:
didAddSubview(_:) willRemoveSubview(_:) willMove(toSuperView:) didMoveToSuperview willMove(toWindow:) didMoveToWindow