Не могли бы вы объяснить мне, как правильно управлять UIViewController
жизненным циклом?
В частности, я хотел бы знать , как использовать Initialize
, ViewDidLoad
, ViewWillAppear
, ViewDidAppear
, ViewWillDisappear
, ViewDidDisappear
, ViewDidUnload
и Dispose
методы в Mono Touch , для UIViewController
класса.
ios
uiviewcontroller
xamarin.ios
lifecycle
Лоренцо Б
источник
источник
Ответы:
Все эти команды вызываются автоматически в соответствующее время iOS, когда вы загружаете / представляете / скрываете контроллер представления. Важно отметить, что эти методы привязаны,
UIViewController
а не кUIView
самим себе. Вы не получите ни одной из этих функций, просто используяUIView
.Там здорово документация на сайте компании Apple здесь . Вставляя просто, хотя:
ViewDidLoad
- Вызывается при создании класса и загрузке из XIB. Отлично подходит для первоначальной настройки и разовой работы.ViewWillAppear
- Вызывается непосредственно перед отображением вашего представления, хорошо для скрытия / отображения полей или любых операций, которые вы хотите выполнять каждый раз, когда представление становится видимым. Поскольку вы можете переходить от одного представления к другому и обратно, оно будет вызываться каждый раз, когда ваше представление собирается появиться на экране.ViewDidAppear
- Вызывается после появления представления - отличное место для запуска анимации или загрузки внешних данных из API.ViewWillDisappear
/DidDisappear
- Та же идея, что иViewWillAppear
/ViewDidAppear
.ViewDidUnload
/ViewDidDispose
- В Objective-C, это то место, где вы выполняете очистку и освобождение материала, но это обрабатывается автоматически, так что вам не нужно ничего делать здесь.источник
ОБНОВЛЕНИЕ: ViewDidUnload устарела в iOS 6, поэтому обновил ответ соответственно.
Жизненный цикл UIViewController представлен здесь:
Преимущество использования Xamarin Native / Mono Touch заключается в том, что он использует собственные API-интерфейсы и, следовательно, следует тому же жизненному циклу ViewController, что и в документации Apple.
источник
Это для последних версий 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
Это событие создает / загружает представление, которым управляет контроллер. Он может загружаться из связанного файла пера или пустого файла,
UIView
если был найден ноль. Это делает его хорошим местом для программного создания ваших представлений в коде.2.
loadViewIfNeeded
Если incase представление current
viewController
еще не было установлено, тогда этот метод загрузит представление, но помните, это доступно только в iOS> = 9.0. Так что, если вы поддерживаете iOS <9.0, то не ожидайте, что она войдет в картину.3.
viewDidLoad
viewDidLoad
Событие вызывается только тогда , когда вид создается и загружается в память , но границы для представления еще не определены. Это хорошее место для инициализации объектов, которые будет использовать контроллер представления.4.
viewWillAppear
Это событие уведомляет
viewController
всякий раз, когда представление появляется на экране. На этом шаге у представления есть границы, которые определены, но ориентация не установлена.5.
viewWillLayoutSubviews
Это первый шаг в жизненном цикле, когда границы завершаются. Если вы не используете ограничения или Auto Layout, вы, вероятно, захотите обновить подпредставления здесь. Это доступно только в iOS> = 5.0. Так что, если вы поддерживаете iOS <5.0, то не ожидайте, что она войдет в картину.
6.
viewDidLayoutSubviews
Это событие уведомляет контроллер представления о том, что подпредставления были настроены. Это хорошее место для внесения любых изменений в подпредставления после их установки. Это доступно только в iOS> = 5.0. Так что, если вы поддерживаете iOS <5.0, то не ожидайте, что она войдет в картину.
7.
viewDidAppear
На
viewDidAppear
событие срабатывает после представления представлен на экране. Что делает его хорошим местом для получения данных из бэкэнд-сервиса или базы данных.8.
viewWillDisappear
В
viewWillDisappear
событие срабатывает , когда вид представленviewController
вот - вот исчезнет, увольте, крышку или спрятаться за другойviewController
. Это хорошее место, где вы можете ограничить свои сетевые вызовы, сделать недействительным таймер или освободить объекты, которые связаны с этимviewController
.9.
viewDidDisappear
Это последний шаг жизненного цикла, к которому любой может обратиться, поскольку это событие происходит сразу после того, как представление представленного объекта
viewController
исчезло, было отклонено, скрыто или скрыто.Теперь, согласно Apple, когда вы реализуете эти методы, вы должны помнить, чтобы вызывать
super
реализацию этого конкретного метода.Надеюсь, это помогло. Спасибо.
ОБНОВЛЕНИЕ - Как @ThomasW указал внутри комментария, так
viewWillLayoutSubviews
иviewDidLayoutSubviews
будет вызываться в другое время, когда загружаются подпредставления основного представления, например, когда загружаются ячейки табличного представления или представления коллекции.ОБНОВЛЕНИЕ - Как @Maria указал внутри комментария, описание
loadView
было обновленоисточник
viewWillLayoutSubviews
иviewDidLayoutSubviews
также будет вызываться в другое время, когда загружаются подпредставления основного представления, например, когда загружаются ячейки табличного представления или представления коллекции.viewWillAppear
viewDidAppear
viewDidDisappear
. Вы должны позвонить супер в какой-то момент.iOS 10,11 (Swift 3.1, Swift 4.0)
По словам
UIViewController
вUIKit
разработчиках,1. loadView ()
Здесь подклассы должны создавать свою собственную иерархию представлений, если они не используют перо . Никогда не должен вызываться напрямую.
2. loadViewIfNeeded ()
Загружает представление контроллера представления, если оно еще не было установлено.
3. viewDidLoad ()
Вызывается после того, как представление было загружено. Для контроллеров представления, созданных в коде, это после -loadView. Для контроллеров представления, разархивированных с пера, это после того, как представление установлено.
4. viewWillAppear (_ animated: Bool)
Вызывается, когда представление собирается сделать видимым. По умолчанию ничего не делает
5. viewWillLayoutSubviews ()
Вызывается непосредственно перед вызовом метода layoutSubviews представления контроллера представления. Подклассы могут реализовывать по мере необходимости. По умолчанию ничего не делает.
6. viewDidLayoutSubviews ()
Вызывается сразу после вызова метода layoutSubviews представления контроллера представления. Подклассы могут реализовывать по мере необходимости. По умолчанию ничего не делает.
7. viewDidAppear (_ animated: Bool)
Вызывается, когда вид полностью перешел на экран. По умолчанию ничего не делает
8. viewWillDisappear (анимированный: Bool)
Вызывается, когда вид закрывается, скрывается или иным образом скрывается. По умолчанию ничего не делает
9. viewDidDisappear (анимированный: Bool )
Вызывается после того, как представление было закрыто, скрыто или иным образом скрыто. По умолчанию ничего не делает
10. viewWillTransition (для размера: CGSize, с координатором: UIViewControllerTransitionCoordinator)
Вызывается, когда представление переходное.
11. willMove (родительский элемент toParentViewController: UIViewController?)
12. didMove (родительский элемент toParentViewController: UIViewController?)
Эти два метода общедоступны для вызова подклассов контейнера при переходе между дочерними контроллерами. Если они переопределены, переопределения должны обеспечить вызов супер.
Аргумент parent в обоих этих методах равен nil, когда дочерний элемент удаляется из родительского элемента; в противном случае он равен новому родительскому контроллеру представления.
13. didReceiveMemoryWarning ()
Вызывается, когда родительское приложение получает предупреждение о памяти. На iOS 6.0 он больше не будет очищать вид по умолчанию.
источник
nib
как упомянуто подloadView
?viewWillLayoutSubviews()
вызывается до того, как объект представления ViewController вызывает егоlayoutSubviews()
методНачиная с iOS 6 и выше. Новая диаграмма выглядит следующим образом:
источник
Давайте сосредоточимся на методах, отвечающих за жизненный цикл UIViewController :
Создание:
- (void)init
- (void)initWithNibName:
Просмотр создания:
- (BOOL)isViewLoaded
- (void)loadView
- (void)viewDidLoad
- (UIView *)initWithFrame:(CGRect)frame
- (UIView *)initWithCoder:(NSCoder *)coder
Обработка изменения состояния просмотра:
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
- (void)viewDidUnload
Обработка предупреждений памяти:
- (void)didReceiveMemoryWarning
Deallocation
- (void)viewDidUnload
- (void)dealloc
Для получения дополнительной информации, пожалуйста, взгляните на UIViewController Class Reference .
источник
Методы
viewWillLayoutSubviews
иviewDidLayoutSubviews
не упоминаются в диаграммах, но они вызываются междуviewWillAppear
иviewDidAppear
. Их можно вызывать несколько раз.источник
Ответ Хайдера является правильным для предварительной версии iOS 6. Однако, начиная с iOS 6, viewDidUnload и viewWillUnload никогда не вызываются. Документы состояние: «Просмотры более не продувает в условиях низкой памяти и поэтому этот метод никогда не вызывается.»
источник
Здесь много устаревшей и неполной информации. Только для iOS 6 и новее :
loadView
[А]viewDidLoad
[А]viewWillAppear
viewWillLayoutSubviews
это первый раз, когда границы завершеныviewDidLayoutSubviews
viewDidAppear
*
viewWillLayoutSubviews
[Ь]*
viewDidLayoutSubviews
[Ь]Примечания:
(а) - Если вы вручную NIL ваш взгляд во время
didReceiveMemoryWarning
,loadView
иviewDidLoad
будет называться снова. То есть по умолчаниюloadView
и вызываетсяviewDidLoad
только один раз для каждого экземпляра контроллера представления.(б) Может вызываться дополнительно 0 или более раз.
источник
viewWillLayoutSubviews
иviewDidLayoutSubviews
также будет вызываться в другое время, когда загружаются подпредставления основного представления, например, когда загружаются ячейки табличного представления или представления коллекции.Объяснение переходов между состояниями в официальном документе: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html.
На этом изображении показаны действительные переходы между различными методами обратного вызова «will» и «did».
Действительные государственные переходы:
Взято из: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController класса Reference_2x.png
источник
Согласно документу Apple - Начните разрабатывать приложения для iOS (Swift) - Работайте с контроллерами представления - Поймите жизненный цикл контроллера представления
источник