it-swarm.cn

“应用程序试图以模态方式呈现一个活动控制器”?

我刚刚遇到一个崩溃,在一个之前没有这样做的应用程序上显示带有此消息的NSInvalidArgumentException

应用程序尝试以模态方式呈现活动控制器UITabBarController:0x83d7f00。

我有一个UITabBarController,它在AppDelegate中创建,并为其提供UIViewControllers数组。

其中一个我想在点击它时以模态方式呈现。我通过实现委托方法来做到这一点

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

如果该视图控制器属于我想以模态方式呈现的类,我返回NO并执行

[tabBarController presentModalViewController:viewController animated:YES];

现在我收到了这个错误,这似乎意味着你不能在模式上呈现一个在其他地方活动的视图控制器(在tabbar中......)我应该说我在XCode 4.2 Developer Preview 7上,所以这是iOS 5(我知道NDA,但我认为我没有提供任何禁止的细节)。我目前没有XCode安装来测试这是否会崩溃编译iOS4 SDK,但我几乎完全确定它没有。

我只想询问是否有人遇到过此问题或有任何建议

87
Javier Soto

假设您有三个视图控制器实例化如下:

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希望您以某种方式处理他们的UI元素。这可能隐藏在人机界面指南的某个地方,因为“不要这样做,因为我们不希望你想要这样做”。

87
lswank

我也有同样的问题。我试图在解雇后提出视图控制器。

[self dismissModalViewControllerAnimated:YES];

当我尝试在没有动画的情况下完成它时,它完美地工作,所以问题是控制器仍然存在。我认为最好的解决方案是在iOS5中使用dismissViewControllerAnimated:completion:

12
Danil

在我的情况下,我试图从不同的视图控制器呈现viewController(我有TabBarViewController中的viewController的引用),它与上面的消息崩溃。在那种情况下避免呈现你可以使用

viewController.isBeingPresented

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

可以帮助别人。

5
Karthick Ramesh

我有同样的问题。我解决了。您可以尝试此代码:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];
2
Erhan Demirci

只需删除

[tabBarController presentModalViewController:viewController animated:YES];

并保持

[self dismissModalViewControllerAnimated:YES];
0
user170317