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


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

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

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

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

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

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

[tabBarController presentModalViewController:viewController animated:YES];

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

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

5 79

5 ответов:

предположим, что у вас есть три контроллера вида, созданные следующим образом:

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];

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

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

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

[self dismissModalViewControllerAnimated:YES];

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

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

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

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

viewController.isBeingPresented

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

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

просто удалить

[tabBarController presentModalViewController:viewController animated:YES];

и сохранить

[self dismissModalViewControllerAnimated:YES];