2015-05-20 2 views
0

Я пытался создать UIAlertController на ViewWillAppear, это давало мне предупреждение ниже.Создание UIAlertController на ViewWillAppear дает предупреждение

"Warning: Attempt to present <UIAlertController: 0x7f8798c15df0> on <ViewController: 0x7f8798f81450> whose view is not in the window hierarchy!". 

Мое понимание готов показать вид пользователю в ViewWillAppear, но довольно дорого.

Однако, когда я переместил тот же код UIAlertController на номер ViewDidAppear, он показывал оповещение. Можете ли вы, пожалуйста, уточнить сыворотку, предупреждающий msg не получает показ в ViewWillAppear.

+1

положил его в метод '-viewDidAppear:', утверждение верное, вы не просматриваете иерархию представления при вызове метода '-viewWillAppear:'. – holex

+0

та же ошибка в viewdidappear – Mona

ответ

1

viewWillAppear: не является хорошим местом для представления другого контроллера представления, поскольку текущий представленный еще не находится в иерархии окон и также находится в переходной анимации. Вы должны либо использовать viewDidAppear:, либо добавить небольшую задержку перед отображением контроллера предупреждения.

2

UIAlertController не похож на типичный UIAlertView, который унаследован от UIView. Добавление UIView в viewDidLoad, появляется и т. Д., Не проблема, потому что вы добавляете его в иерархию представлений контроллера представления.

Теперь, с UIAlertController, это контроллер класса первого класса. Это означает, что вы должны представить его так же, как и другие контроллеры представлений - все те же правила применяются.

В viewWillAppear контроллер вида не добавляется в иерархию окна, поэтому плохое представление для контроллера предупреждений. Как вы нашли, viewDidAppear - это путь сюда.

+0

та же ошибка в viewdidappear – Mona

1

Большинство ответов на здесь очень хорошо освещают эту тему, я просто хотел добавить дополнительные сведения. Как правило, нет проблем с добавлением контроллеров детского вида в viewWillAppear: или даже viewDidLoad:. Фактически, если вы используете контроллер контейнера в IB, он будет интегрирован до того, как будет вызван любой из них.

Проблема более конкретно в том, что касается диспетчера предупреждений. Контроллеры предупреждений функционируют в другой иерархии окон, чем ваш типичный пользовательский интерфейс (думаю, ось Z), и управляйте пользовательским интерфейсом более интенсивно, чем стандартный контейнер (поскольку он не является контейнером).

Для того, чтобы предупреждение было надлежащим образом представлено, оно должно произойти после отображения текущего вида (здесь может быть несколько причин). Вот почему представление его в viewDidAppear: сработало (так как текущий вид vc будет полностью вживую).

Смежные вопросы