Это для последних версий iOS (изменено с Xcode 9.3, Swift 4.1 ).Ниже приведены все этапы, которые завершают жизненный цикл UIViewController
.
loadView()
loadViewIfNeeded()
viewDidLoad()
viewWillAppear(_ animated: Bool)
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewDidAppear(_ animated: Bool)
viewWillDisappear(_ animated: Bool)
viewDidDisappear(_ animated: Bool)
Позвольте мне объяснитьвсе эти этапы.
1.loadView
Это событие создает представление, которым управляет контроллер.Он вызывается только тогда, когда контроллер представления создается программно.Это делает его хорошим местом для создания ваших представлений в коде.
Здесь подклассы должны создавать свою собственную иерархию представлений, если они не используют кончик.Никогда не должен вызываться напрямую.
2.loadViewIfNeeded
Если текущее представление viewController
еще не было установлено, тогда этот метод загрузит представление, но помните, что это доступно только в iOS> = 9.0.Поэтому, если вы поддерживаете iOS <9.0, не ожидайте, что она появится на картинке. </p>
Загружает представление контроллера представления, если оно еще не было установлено.
3.viewDidLoad
Событие viewDidLoad
вызывается только тогда, когда представление создано и загружено в память, но границы для вида еще не определены.Это хорошее место для инициализации объектов, которые будет использовать контроллер представления.
Вызывается после загрузки представления.Для контроллеров представления, созданных в коде, это после -loadView.Для контроллеров представления, разархивированных с пера, это происходит после установки представления.
4.viewWillAppear
Это событие уведомляет viewController
всякий раз, когда на экране появляется изображение.На этом шаге у представления есть границы, которые определены, но ориентация не установлена.
Вызывается, когда представление собирается сделать видимым.По умолчанию ничего не делает.
5.viewWillLayoutSubviews
Это первый шаг в жизненном цикле, когда границы завершаются.Если вы не используете ограничения или Auto Layout, вы, вероятно, захотите обновить подпредставления здесь.Это доступно только в iOS> = 5.0.Так что, если вы поддерживаете iOS <5.0, то не ожидайте, что она войдет в картину.</p>
Вызывается непосредственно перед вызовом метода layoutSubviews представления контроллера представления.Подклассы могут реализовывать по мере необходимости.По умолчанию используется nop.
6.viewDidLayoutSubviews
Это событие уведомляет контроллер представления о том, что подпредставления были настроены.Это хорошее место для внесения любых изменений в подпредставления после их установки.Это доступно только в iOS> = 5.0.Так что, если вы поддерживаете iOS <5.0, не ожидайте, что она появится на картинке. </p>
Вызывается сразу после вызова метода viewSubviews для представления контроллера.Подклассы могут реализовывать по мере необходимости.По умолчанию используется nop.
7.viewDidAppear
Событие viewDidAppear
возникает после того, как представление отображается на экране.Это делает его хорошим местом для получения данных из серверной службы или базы данных.
Вызывается, когда представление полностью перемещено на экран.По умолчанию ничего не делает
8.viewWillDisappear
Событие viewWillDisappear
происходит, когда представление представленного viewController
собирается исчезнуть, отклониться, скрыться или скрыться за другим viewController
.Это хорошее место, где вы можете ограничить свои сетевые вызовы, аннулировать таймер или разблокировать объекты, связанные с этим viewController
.
Вызывается, когда представление закрывается, закрывается или иным образом скрывается.
9.viewDidDisappear
Это последний этап жизненного цикла, к которому любой может обратиться, поскольку это событие происходит сразу после того, как представление представленного viewController
исчезло, отклонено, закрыто или скрыто.
Вызывается после того, как представление было закрыто, скрыто или иным образом скрыто.По умолчанию ничего не делает
Теперь, согласно Apple , когда вы реализуете эти методы, вы должны не забыть вызвать super
реализацию этого конкретного метода.
Если вы создаете подкласс UIViewController, вы должны вызвать супер реализацию этого метода, даже если вы не используете NIB.(Для удобства метод init по умолчанию сделает это за вас, и для обоих аргументов этого метода будет указано значение nil.) В указанном NIB прокси-серверу владельца файла должен быть установлен класс для вашего подкласса контроллера представления с выходом представленияподключен к основному виду.Если вы вызываете этот метод с именем nil nib, тогда этот метод класса -loadView
попытается загрузить NIB, имя которого совпадает с классом вашего контроллера представления.Если такого NIB на самом деле не существует, вы должны либо вызвать -setView:
до вызова -view
, либо переопределить метод -loadView
для программной настройки ваших представлений.
Надеюсь, это помогло.Спасибо.
ОБНОВЛЕНИЕ - Как указывало @ThomasW внутри комментария, viewWillLayoutSubviews
и viewDidLayoutSubviews
также будут вызываться в другое время, когда загружаются подпредставления основного представления, например, когда ячейкизагружается табличное представление или представление коллекции.