"Приложение попыталось представить модально активный контроллер"?

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

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

Ответ 1

Предположим, что у вас три экземпляра, созданных таким образом:

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 ожидает, что вы будете относиться к своим элементам пользовательского интерфейса определенным образом. Вероятно, это похоронили в Руководстве по человеческому интерфейсу где-то "не делайте этого, потому что мы не ожидаем, что вы когда-нибудь захотите это сделать".

Ответ 2

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

[self dismissModalViewControllerAnimated:YES];

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

Ответ 3

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

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

Ответ 4

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

viewController.isBeingPresented

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

Может помочь кому-то.

Ответ 5

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

[tabBarController presentModalViewController:viewController animated:YES];

и сохраните

[self dismissModalViewControllerAnimated:YES];