Я программно добавляю SubViews в ViewDidAppear, ViewDidLoad, ViewWillAppear, конструкторе?

Я пытаюсь фигурировать из поверхностной документации 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 скрыта где-нибудь.

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

25
задан Cœur 4 April 2017 в 14:56
поделиться

2 ответа

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

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

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

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

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

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

73
ответ дан 28 November 2019 в 17:51
поделиться

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

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

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

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

9
ответ дан 28 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: