Я пытаюсь фигурировать из поверхностной документации Apple, какой метод является лучшим местом, чтобы инициализировать и добавить мои средства управления Представлениями к представлению контроллера.
С winforms это довольно просто, поскольку они всегда инициализируются внутри InitializeDesigner
, названный в конструкторе. Я пытаюсь соответствовать надежности этого шаблона, если это возможно.
Я работаю с UIViewControllers
и UITableViewControllers
внутри a UINavigationController
большую часть времени - если это производит все это.
Вот пример:
public MyController()
{
// Here?
AddViews();
}
public override ViewDidLoad()
{
base.ViewDidLoad();
// Or is should it be here?
AddViews();
}
public override ViewWillAppear(bool )
{
base.ViewWillAppear(animated);
// Here?
AddViews();
}
public override ViewDidAppear(bool animated)
{
base.ViewDidLoad(animated);
// Or maybe here?
AddViews();
}
void AddViews()
{
UILabel label = new UILabel();
label.Text = "Test";
label.Frame = new RectangleF(100,100,100,26);
View.AddSubView(label);
UIWebView webview = new UIWebView();
webview .Frame = new RectangleF(100,100,100,26);
View.AddSubView(webview);
}
Я получаю смешанные результаты с некоторым UIControls, когда я добавляю их к представлению в различных местах. Визуальная задержка иногда, othertimes webview скрыта где-нибудь.
Существует ли общее правило придерживаться для добавления их?
В общем, это то, что я делаю:
ViewDidLoad - Всякий раз, когда я добавляю элементы управления в представление, которое должно отображаться вместе с представлением, я сразу помещаю его в метод ViewDidLoad. В основном этот метод вызывается всякий раз, когда представление загружалось в память. Так, например, если мое представление является формой с 3 метками, я бы добавил метки сюда; представление никогда не будет существовать без этих форм.
ViewWillAppean : Я использую ViewWillAppean обычно только для обновления данных в форме. Итак, для примера выше, я бы использовал это, чтобы фактически загрузить данные из моего домена в форму. Создание UIViews довольно дорого, и вы должны избегать как можно больше делать это на методе ViewWillAppearance, потому что, когда это называется, это означает, что iPhone уже готов показать UIView для пользователя, и все тяжелое вы делаете здесь будет влиять на производительность в очень видимой манере (как анимации задерживаются и т.д.).
ViewDidAppean : Наконец, я использую ViewDidAppean, чтобы начать новые потоки для вещей, которые займут много времени, например, для вызова веб-службы, чтобы получить дополнительные данные для формы выше. Хорошо то, что, поскольку представление уже существует и отображается пользователю, вы можете показать приятное сообщение «Ожидание» пользователю, пока вы получите данные.
Есть и другие уловки, которые вы можете использовать. Давайте скажем, что вы хотите, чтобы UILabel «летел» в форму после загрузки формы. В этом случае я добавляю метку к форме в ViewDidLoad, но с кадром вне области просмотра, а затем в ViewDidAppean я выполняю анимацию, чтобы улететь обратно в поле зрения.
Надеюсь, это поможет.
Хм, документы Apple кажутся довольно ясными, ИМХО.
Если вы создаете собственное корневое представление (корневое представление иерархии представлений этого конкретного контроллера) программно, вы должны создать его в -loadView
без вызова super
и установить ] просмотреть свойство
по завершении. Если ваше представление загружается из пера, вам не следует касаться -loadView
.
Вы добавляете пользовательские подпредставления к представлению контроллера представления или иным образом изменяете его в -viewDidLoad
. Рекомендуется создать свои UILabel и UIWebView в -viewDidLoad
и выпустить их в -viewDidUnload
, установив их ссылки на nil
, если вам нужно сохранить их в ivars.
Примечание. -viewDidUnload
устарел в iOS 6 и просто больше не вызывается, потому что UIViewController
больше не очищает свое представление из-за нехватки памяти.