UIViewController viewDidLoad и viewWillAppear: Какое надлежащее разделение труда?

Я всегда был немного неясен о типе задач, которые должны быть назначены viewDidLoad vs. viewWillAppear: в подклассе UIViewController.

например. Я делаю приложение, где у меня есть подкласс UIViewController, попадающий на сервер, получающий данные, подающий его в представление, а затем отображение этого представления. Каковы плюсы и минусы этого в viewDidLoad vs. viewWillAppear?

Ответ 1

viewDidLoad - это то, что вам нужно сделать один раз. viewWillAppear вызывается каждый раз, когда появляется представление. Вы должны делать то, что вам нужно сделать только один раз в viewDidLoad - например, для настройки ваших текстов UILabel. Тем не менее, вы можете захотеть изменить определенную часть представления каждый раз, когда пользователь будет ее просматривать, например. приложение iPod прокручивает лирику до самого верха каждый раз, когда вы переходите к представлению "Now Playing".

Однако, когда вы загружаете вещи с сервера, вам также нужно думать о задержке. Если вы упакуете всю свою сетевую связь в viewDidLoad или viewWillAppear, они будут выполнены до того, как пользователь увидит представление - возможно, это приведет к небольшому замораживанию вашего приложения. Это может быть хорошей идеей, чтобы сначала показать пользователю незаселенное представление с индикатором активности. Когда вы закончите работу с сетью, которая может занять секунду или два (или может даже не срабатывать - кто знает?), Вы можете заполнить представление своими данными. Хорошие примеры того, как это можно сделать, можно увидеть в разных клиентах Twitter. Например, когда вы просматриваете страницу подробностей автора в Twitterrific, в представлении указывается только "Загрузка..." до тех пор, пока сетевые запросы не будут завершены.

Надеюсь, что вам немного помогли,

Leon

Ответ 2

Первоначально использовался только ViewDidLoad с tableView. При тестировании с потерей Wi-Fi, установив устройство в режим полета, понял, что таблица не обновилась с возвратом Wi-Fi. На самом деле, похоже, нет способа обновить tableView на устройстве, даже нажав кнопку "домой" с фоновым режимом, установленным в YES в "Info.plist".

Мое решение:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

Ответ 3

Важно отметить, что использование viewDidLoad для позиционирования немного рискованно и его следует избегать, поскольку границы не заданы. это может привести к неожиданным результатам (у меня было множество проблем...)

В этом сообщении достаточно хорошо описаны разные методы и что происходит в каждом из них.

в настоящее время для одноразовой инициализации и позиционирования Я подумываю использовать viewDidAppear с флагом, если у кого есть какие-либо другие рекомендации, пожалуйста, дайте мне знать.

Ответ 4

Зависит, вам нужны данные для загрузки each, когда вы открываете представление? или только один раз?

введите описание изображения здесь

  • Красный: Они не требуют изменения каждый раз. Как только они загружаются, они остаются такими, как они.
  • Фиолетовый: Они должны меняться со временем или после загрузки каждый раз. Вы не хотите, чтобы те же самые 3 предложенные пользователи следовали, их нужно перезагружать каждый раз, когда вы возвращаетесь к экрану. Их фотографии могут быть обновлены... вы не хотите видеть фотографию с 5 лет назад...

viewDidLoad:. Какую бы обработку вы ни делали, нужно сделать один раз. viewWilLAppear: Независимо от обработки, которая должна меняться каждый раз при загрузке страницы.

Ярлыки, значки, названия кнопок или большинство данныхInputedByDeveloper обычно не меняются. Имена, фотографии, ссылки, статус кнопки, списки (входные массивы для tableViews или collectionView) или большинство dataInputedByUser обычно меняются.