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

"NSInvalidArgumentException", причина: "Лист не может быть представлен, потому что представление не находится в окне

После обновления Xcode с версии 4 до 5 и, следовательно, с iOS 6 до iOS 7 я получаю следующую ошибку:

'NSInvalidArgumentException', причина: "Лист не может быть представлен, потому что представление не находится в окне

в этой строке:

[actionSheet showInView:self.view];
4b9b3361

Ответ 1

У меня буквально была такая же проблема, и, к сожалению, я до сих пор не знаю, в чем главная причина проблемы. Однако вы найдете мое текущее решение ниже. Если я сделаю какой-то прогресс в корне, вызвав проблему, я дам вам знать.

UIWindow* window = [[[UIApplication sharedApplication] delegate] window];
if ([window.subviews containsObject:self.view]) {
    [emailSheet showInView:self.view];
} else {
    [emailSheet showInView:window];
}

Ответ 2

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

Ответ 3

Я не знаю, в чем основная причина проблемы, но я нашел решение, которое работает для меня. Вместо self.view поместите эту строку:

[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]

например:

[actionSheet showInView:[[[[UIApplication sharedApplication] keyWindow] subviews] lastObject]];

Ответ 4

У меня была та же проблема, и в моем случае это произошло, когда я попытался показать ActionSheet на моем self.view, в то время как мой self.view представлял другой viewController.

Это краш: "Лист не может быть представлен, потому что представление не находится в окне"

пример проблемы:

[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet showInView:self.view];

Я решил проблему, ожидая отключения modalViewController, а затем покажет ActionSheet.

Решение:

[modalViewController dismissModalViewControllerAnimated:YES];
[actionSheet performSelector:@selector(showInView:) withObject:self.view afterDelay:0.6];

Надеюсь, это поможет многим людям:)

Ответ 5

У меня была та же проблема [actionSheet showInView:self.view];, и я решил ее с помощью [actionSheet showInView:[UIApplication sharedApplication].keyWindow];.

Возможно, проблема связана с абзацем документации Apple:

Примечания к подклассам:

UIActionSheet не предназначен для подкласса, и вы не должны добавлять представления в свою иерархию. Если вам нужно представить лист с большей настройкой, чем предоставленный API UIActionSheet, вы можете создать свой собственный и представить его с помощью presentViewController:animated:completion:.

Ответ 6

В моем случае это случается, когда диспетчер представлений, который только что нажат в стек, решает, что он хочет показать лист предупреждений. Но, видимо, viewcontroller еще не полностью готов сделать это сразу после его нажатия. Я использую [actionSheet showInView:self.parentViewController.view]; вместо [actionSheet showInView:self.view];.

Ответ 7

У меня была аналогичная проблема с панелью инструментов, и лучше всегда проверять, не имеет ли пропущенное представление селектора showInView окно не ноль. Например:

if (self.view.window)
    [actionSheet showInView:self.view];

Таким образом, мы можем избежать раздражающих исключений. Затем, в соответствии с вашим макетом приложения, вы должны найти действительное представление, чтобы отобразить лист действий. Если у вашего приложения есть вкладка или панель инструментов, лучше использовать

- (void)showFromToolbar:(UIToolbar *)view;
- (void)showFromTabBar:(UITabBar *)view;

Ответ 8

Ранее я использовал

- (void)showFromTabBar:(UITabBar *)view;

и столкнуться с аналогичной проблемой с одним из моих контроллеров (у меня есть метод утилиты, который обрабатывает список действий из разных контроллеров), поскольку он устанавливает

hidesBottomBarWhenPushed = YES;

В iOS 7 теперь появляется окно с номером nil на tabBar, вызывающим упомянутую ошибку. Мое обходное решение - проверить свойство окна tabBar, и если nil вызовет

if (nil == tabBar.window) {
    [actionSheet showInView:self.window];
}
else {
    [actionSheet showFromTabBar:tabBar];
}

Ответ 9

В iOS 7 представление отправки на showInView: должно быть частью иерархии представлений. Он должен быть добавлен в качестве подсмотра некоторого представления.
Вы можете проверить, может ли какое-либо представление использоваться в showInView:, проверяя, является ли view.window нулем или нет.
view.superview также должен быть не ноль