Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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