В чем разница между -viewWillAppear: и -viewDidAppear :? - PullRequest
129 голосов
/ 12 апреля 2011

В чем разница между -[UIViewController viewWillAppear:] и -[UIViewController viewDidAppear:]?

Ответы [ 12 ]

287 голосов
/ 14 апреля 2011

В общем, вот что я делаю:

1) ViewDidLoad - Всякий раз, когда я добавляю элементы управления к представлению, которое должно сразу появиться вместе с представлением, я помещаю его в метод ViewDidLoad. В основном этот метод вызывается всякий раз, когда представление загружается в память. Например, если мое представление представляет собой форму с 3 метками, я бы добавил сюда метки; представление никогда не будет существовать без этих форм.

2) ViewWillAppear : я обычно использую ViewWillAppear просто для обновления данных в форме. Итак, для примера выше, я бы использовал это для загрузки данных из моего домена в форму. Создание UIViews довольно дорого, и вам следует избегать, насколько это возможно, использования метода ViewWillAppear, поскольку при его вызове это означает, что iPhone уже готов показать UIView пользователю и все, что вы здесь делаете. будет влиять на производительность очень заметным образом (например, задержка анимации и т. д.).

3) ViewDidAppear : Наконец, я использую ViewDidAppear для запуска новых потоков с вещами, выполнение которых может занять много времени, как, например, выполнение вызова веб-службы для получения дополнительных данных для формы выше .Хорошо то, что, поскольку представление уже существует и отображается для пользователя, вы можете показывать пользователю приятное сообщение «Ожидание», пока вы получаете данные.

45 голосов
/ 31 октября 2013

viewDidLoad === >>> Введите свой код инициализации здесь.Не помещайте динамические данные, которые могут измениться в течение жизненного цикла представления.Таким образом, если вы извлекаете данные из базовых данных, вы не хотите делать это здесь, если это может измениться в течение срока действия представления.Например: скажем, у вас есть контроллер вкладок.Вы переключаетесь с tab1 на tab2 и что-то меняете в модели на tab2.Если вы вернетесь к tab1 и ваш код модели будет выполнен в viewDidLoad, он не будет обновлен (если вы не используете KVO или NSFetchedResultsController и т. Д.).

viewWillAppear ===>>> Это вызывается каждый раз, когда представление должно появиться, независимо от того, находится ли представление уже в памяти.Поместите сюда свой динамический код, например, логику модели.

viewDidAppear === >>> Поместите здесь дорогостоящие операции, которые вы хотите выполнять, только если уверены, что представление на экране,например, сетевые вызовы.

Примечание: если ваше приложение имеет фон и возвращается на передний план, вам нужно справиться с этим с помощью NSNotificationCenter.Я написал код для этого в комментариях ниже.Вы можете подумать, что viewWillAppear / viewDidAppear сработает.Поставь точку останова и проверь ее.Это не огонь.Так что, если что-то изменилось для вашего приложения, когда оно было в фоновом режиме, вам необходимо обновить это с помощью уведомлений.

12 голосов
/ 17 сентября 2012

Метод viewWillAppear вызывается перед загрузкой фактического представления.

Метод viewDidAppear вызывается, когда представление уже загружено, и вы хотите что-то показать.

8 голосов
/ 11 марта 2015

viewWillAppear:
■ Вызывается до того, как представление добавляется в иерархию представления Windows
■ Вызывается до [vc.view layoutSubviews] (при необходимости)
viewDidAppear:
■ Вызывается после добавления представления в иерархию представлений
■ Вызывается после [vc.view layoutSubviews] (при необходимости)

5 голосов
/ 11 сентября 2018

Несколько замечаний:

  • Метод viewDidLoad вызывается при первом создании представления. IBOutlet ссылки подключаются ко времени, когда это было вызвано, но не раньше. Тем не менее, frame представления не может быть установлено к тому времени, когда это было вызвано. Это отличное место для добавления / настройки подпредставлений и связанных с ними ограничений. Но если вы выполняете какую-либо ручную настройку значений frame на основе размеров основного представления, конфигурация этих кадров должна быть отложена до viewWillAppear или viewDidLayoutSubviews.

  • Метод viewWillAppear вызывается, когда начинается представление представления в иерархии представлений. Примечательно, что это вызывается в начале анимации (если есть) представления представления. Его спутник viewWillDisappear явно вызывается, когда начинается переход от этого представления.

  • Метод viewDidAppear вызывается, когда завершается представление представления, особенно когда завершается любая связанная анимация. Его компаньон, viewDidDisappear, очевидно, вызывается, когда сделан переход от этого представления.

Два важных предостережения:

  • viewDidLoad вызывается один раз и только один раз, когда представление создается впервые. С другой стороны, viewWillAppear и viewDidAppear будут вызываться не только при первом представлении представления, но каждый раз при повторном представлении того же представления. Например, когда вы впервые представляете представление, будут вызваны все эти три метода. Если рассматриваемое представление впоследствии представляет другое представление, которое впоследствии отклоняется, viewWillAppear и viewDidAppear будут обычно вызываться снова, когда рассматриваемое представление добавляется и анимируется обратно в иерархию представления, но viewDidLoad - нет. viewDidLoad вызывается только при первом создании этого конкретного экземпляра.

    Итак, если вы хотите что-то делать каждый раз, когда представление появляется (например, вы закрываете его или возвращаетесь к нему), сделайте это в viewWillAppear или viewDidAppear. Если вы хотите, чтобы это происходило только при первом создании представления, сделайте это в viewDidLoad.

  • Вызов viewWillAppear не гарантирует, что переход к этому представлению когда-либо будет завершен. Примечательно, что если вы используете интерактивный переход, управляемый пользовательским вводом в реальном времени, но этот интерактивный переход можно отменить. То есть, то, что viewWillAppear вызван, не означает, что viewDidAppear будет вызван. Обычно это так, но если интерактивный жест отменен, он не будет (потому что переход не завершен).

    На WWDC 2013, в контексте интерактивных переходов, докладчик пошутил, что они должны переименовать viewWillAppear в "viewMightAppear, или viewWillProbablyAppear, или iReallyWishThisViewWouldAppear".

    Примером встроенного интерактивного жеста является использование UINavigationController, и вы «проводите от левого края», чтобы инициировать всплывающее представление вида. viewWillAppear будет вызываться для представления, к которому вы подключаетесь, но если вы отмените этот «пролистывание от левого края», чтобы вернуться к представлению, с которого вы начали этот жест, всплывающее окно отменяется, и viewDidAppear поскольку представление, к которому вы начали возвращаться, никогда не будет вызвано.

    Чистый эффект этого состоит в том, что вы должны быть осторожны, чтобы не писать код, предполагающий, что за каждым вызовом viewWillAppear последует вызов viewDidAppear. Если переход отменен, это не будет иметь место.

5 голосов
/ 12 апреля 2011

viewwillappear будет вызывать перед загрузкой представления, чтобы вы могли выполнить определенную задачу перед загрузкой этого представления, а viewdidappear будет вызывать после загрузки представления, чтобы задача публикации выполнялась в этом методе

4 голосов
/ 11 сентября 2018

1) ViewWillAppear : представление, загруженное фактически в память, вызывается один раз в контроллере представления и имеет свой кадр, но все еще не отображается для пользователя

2) ViewDidAppear : контроллер добавлен в иерархию представлений, чтобы вы могли представить его следующему контроллеру, также, вид сделал макет подпредставлений

4 голосов
/ 15 апреля 2013

Разница между "will" и "did" ... Как следует из названия, viewWillAppear вызывается до того, как представление должно появиться, и viewDidAppear вызывается, когда представление действительно появляется.

3 голосов
/ 28 июля 2015

Подводя итог:

-viewWillAppear -> обновить данные (перезагрузить данные из представления таблицы)

-viewDidAppear -> дорогостоящие операции (вызов API с хорошим прогрессом!)

3 голосов
/ 12 апреля 2011

Первое происходит до появления представления, а второе - после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...