"Приложение пыталось представить модально активный контроллер"? - PullRequest
90 голосов
/ 15 сентября 2011

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

Приложение пыталось модально представить активный контроллер UITabBarController: 0x83d7f00.

У меня есть UITabBarController, который я создаю в AppDelegate и даю ему массив UIViewControllers.

Один из них я хочу представить модально при нажатии на него,Я сделал это, реализовав метод делегата

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

Если этот контроллер представления относится к классу, который я хочу представить модально, я возвращаю NO и делаю

[tabBarController presentModalViewController:viewController animated:YES];

И теперьЯ получаю эту ошибку, которая, кажется, означает, что вы не можете представить модально контроллер представления, который активен где-то еще (на панели вкладок ...). Я должен сказать, что я нахожусь на XCode 4.2 Developer Preview 7, так что этоiOS 5 (я знаю о NDA, но я думаю, что я не даю никаких запрещенных деталей).В настоящее время у меня нет установки XCode для проверки сбоя при компиляции с iOS4 SDK, но я почти полностью уверен, что это не так.

Я только хотел спросить, сталкивался ли кто-нибудь с этой проблемой илиесть предложения

Ответы [ 5 ]

90 голосов
/ 23 сентября 2011

Предположим, что у вас есть три контроллера вида, например, так:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

Вы добавили их на панель вкладок следующим образом:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

Теперь вы пытаетесь сделать что-то вроде этого:

[tabBarController presentModalViewController:vc3];

Это даст вам ошибку, потому что у этого контроллера панели вкладок есть смертельная хватка на контроллере представления, который вы ему дали. Вы можете либо не добавлять его в массив контроллеров представления на панели вкладок, либо нельзя представить его модально.

Apple ожидает, что вы будете обрабатывать их элементы пользовательского интерфейса определенным образом. Это, вероятно, скрыто в Руководстве по взаимодействию с людьми где-то как «не делайте этого, потому что мы не ожидаем, что вы когда-нибудь захотите это сделать».

12 голосов
/ 06 декабря 2011

У меня такая же проблема. Я пытаюсь представить контроллер вида сразу после увольнения.

[self dismissModalViewControllerAnimated:YES];

Когда я пытаюсь сделать это без анимации, она работает отлично, поэтому проблема в том, что контроллер все еще жив. Я думаю, что лучшим решением является использование dismissViewControllerAnimated:completion: для iOS5

5 голосов
/ 13 июля 2018

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

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Может помочь кому-нибудь.

2 голосов
/ 30 апреля 2013

У меня была такая же проблема. Я ее решаю. Вы можете попробовать этот код:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
0 голосов
/ 18 октября 2011

Просто удалите

[tabBarController presentModalViewController:viewController animated:YES];

и сохраните

[self dismissModalViewControllerAnimated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...