“应用程序试图模态显示一个主动控制器”?


100

我刚刚遇到崩溃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编译时崩溃,但是我几乎完全可以确定没有崩溃。

我只想问问是否有人遇到过这个问题或有什么建议


在iOS 5之前,这没有引发异常,但是什么也没有返回。从iOS 5开始,此命令引发异常。
弗雷德里克·阿达

Answers:


103

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

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

这将给您带来错误,因为Tab Bar Controller在您赋予它的视图控制器上有死锁。您不能将其添加到选项卡栏上的视图控制器数组中,也不能以模态形式显示它。

Apple希望您以某种方式对待他们的UI元素。这可能被埋在“人机界面指南”中的某个地方,因为“不要这样做,因为我们不希望您这样做。”


6
问题是在iOS 5之前这绝对没有问题,因此我很担心!我所做的是在选项卡栏中添加了一个虚拟UIViewController并以模态形式呈现了实际的视图控制器子类实例。
哈维尔·索托

1
@Iswank,现在在iOS 6中,为了使事情“更轻松”,他们弃用了presentModalViewController导致各种旋转问题...您需要使用presentViewController:animated:完成并检查您的应用如何处理更改
Whyo​​z

15

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

[self dismissModalViewControllerAnimated:YES];

当我尝试在不使用动画的情况下进行操作时,它可以完美运行,因此问题在于控制器仍然有效。我认为最好的解决方案是dismissViewControllerAnimated:completion:用于iOS5


如果您关闭它的动画效果,它将失败,因为当您要再次显示模态视图控制器时,它仍然以模态形式出现在屏幕上,被动画化了。
Pascal

2
它在IOS 6.0中有所描述
Sumit Kumar Saha

12

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

viewController.isBeingPresented

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

可能会帮助某人。


它仅在viewWillappperar中工作,但是当我在呈现已经呈现的viewController之前进行检查时,它总是返回false。
大师

1
不为我工作。仍然会导致应用崩溃。(!viewController.presentingViewController)解决了问题。
阿古斯

3

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

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

2

当我尝试present使用子视图控制器而不是UINavigationViewController其父视图控制器时,发生了相同的问题错误


0

只需删除

[tabBarController presentModalViewController:viewController animated:YES];

并保持

[self dismissModalViewControllerAnimated:YES];

这给出了已过时的警告...那么这是什么替代方案?
Kirtikumar A.

在这里,我使用了[blockSelf dismissViewControllerAnimated:YEScomplete:nil];
Kirtikumar A.

0

而不是使用:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

您可以使用:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.