В чем разница между жизненным циклом контроллера представления и жизненным циклом представления в 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
Другие вопросы по тегам