Нужно ли программным способом добавлять подвиды в ViewDidAppear, ViewDidLoad, ViewWillAppear, в конструктор? - PullRequest
25 голосов
/ 17 февраля 2010

Я пытаюсь выяснить из отрывочной документации Apple, какой метод лучше всего инициализировать и добавить мои элементы управления Views в представление контроллера.

С winforms это довольно просто, так как они всегда инициализируются внутри InitializeDesigner, вызываемой в конструкторе. Я пытаюсь сопоставить надежность этого шаблона, если это возможно.

Я работаю с UIViewControllers и UITableViewControllers внутри 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, когда добавляю их в представление в разных местах. Визуальное отставание иногда, иногда веб-просмотр спрятан где-то.

Есть ли общее правило, которое нужно соблюдать для добавления их?

Ответы [ 3 ]

73 голосов
/ 17 февраля 2010

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

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

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

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

Однако есть и другие приемы, которые вы можете использовать.Допустим, вы хотите, чтобы UILabel «влетела» в форму после загрузки формы.В этом случае я бы добавил метку к форме в ViewDidLoad, но с рамкой вне области просмотра, а затем в ViewDidAppear я бы сделал анимацию, чтобы вернуть ее обратно в представление.

Надеюсь, что этопомогает.

9 голосов
/ 17 февраля 2010

Хм, документы Apple кажутся довольно понятными, ИМХО.

Если вы создаете свое собственное корневое представление (корневое представление иерархии представлений этого конкретного контроллера) программно, вы должны создать его в -loadView без вызова super и установить свойство view по завершении. Если ваш вид загружен из пера, вы не должны касаться -loadView.

Вы добавляете пользовательские подпредставления в представление контроллера представления или иным образом изменяете его в -viewDidLoad. Рекомендуется создать UILabel и UIWebView в -viewDidLoad и выпустить их в -viewDidUnload, установив их ссылки на nil, если вам нужно сохранить их в ivars.

Примечание: -viewDidUnload устарела в iOS 6 и больше не вызывается, потому что UIViewController больше не очищает свой взгляд под давлением памяти.

2 голосов
/ 05 января 2012

viewDidLoad относится к 'MEMORY', а viewWillAppear / viewDidAppear относится к 'APPEARANCE'. Представление контроллера представления (которое является корневым представлением представлений вашего контроллера представления) может появляться / исчезать много раз, даже если представление контроллера уже находится в памяти.

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

Корневое представление МОЖЕТ быть удалено из памяти при появлении предупреждения о памяти. Контроллер представления определит, когда лучше всего удалять их из памяти.

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

...