【问题标题】:Application tried to present modally an active controller : UIImagePickerController应用程序试图以模态方式呈现一个活动控制器:UIImagePickerController
【发布时间】:2013-02-15 21:52:34
【问题描述】:

我为此苦苦挣扎了 2 天,并相信这是我应该寻求帮助的时刻。在我搜索 SOF 一段时间后,没有任何答案可以解决我的问题。这是我的应用程序...

在应用程序中,

  • 设备是 iPad、iOS 6
  • RootViewController 是 NavigationController
  • TopViewController 是 TabBarController
  • 在这个 TabBarController 中,我从导航栏的右栏按钮展示了一个 popoverController
  • 在呈现弹出框时,有一个按钮允许用户通过获取新图像或从现有图像中选取图像。
  • 为了选择一个新的,我提出了ViewController UIImagePickerController 来允许用户使用divice camera 拍照。 presentModalViewController:animated: 如果 iOS presentViewController:animated:completion: 对于 iOS > 6
  • 我还在演示前隐藏了状态栏
  • 要从现有照片中进行选择,我会 presentPopoverFromBarButtonItem:permitArrowDirections:animated:
  • PopoverViewController 也被 A TabBarController 引用

问题来了

  • 如果用户尝试首先选择新的 UIImagePickerController 将始终失败,但出现异常 “应用程序试图以模态方式呈现活动控制器 ”
  • 但是,如果用户尝试从相机胶卷中选择一次图像,然后再次尝试拍摄新的图像,它不会失败。

这是我尝试过的

  • 来自 RootViewController
  • 来自 TopViewController (TabBarController)
  • 从 popoverViewController 本身呈现
  • 从 TabBarController 的标签显示
  • 在演示之前隐藏 popoverViewController
  • resignFirstResponder 来自 popoverViewController 中的文本字段

这是我正在使用的当前代码

// PopoverViewController, presented by a tab in TabBarController
- (IBAction)takePhoto:(id)sender {
    [self.delegate takePhotoWithDeviceCamera];
}

// A Tab in TabBarController, delegate of popoverViewController
- (void)takePhotoWithCamera {
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    if ([UIDevice OSVersion] < 6.0) {
        [self presentModalViewController:cameraPicker animated:YES];
    } else {
        [self presentViewController:cameraPicker animated:YES completion:nil];
    }
}

知道什么会导致这个错误吗?欢迎任何建议。谢谢。

【问题讨论】:

  • 看看这里Click。也许有帮助。
  • 告诉我们你在哪里解雇了 VC
  • 谢谢@junkor,但是,我已经读过了。事实是,我想我在发布之前在 SOF 上阅读了所有与此相关的问题。现在,我决定清醒一下,稍后再回来,重做整个过程,看看会发生什么。
  • @Daij-Djan 关闭时不是错误,而是在演示时。我在关闭代码处添加了一个断点,但从未达到。
  • 你真的不想显示任何代码^^

标签: objective-c ios5 ios6 uiimagepickercontroller presentmodalviewcontroller


【解决方案1】:

你有试过这样呈现吗?

[self.view.window.rootViewController presentModalViewController:cameraPicker animated:YES];

【讨论】:

  • 是的,我按照上面提到的做了。从 RootViewController、TopViewController、PopoverViewController 和 TabBarController 呈现出来的结果是一样的。感谢您的建议。
【解决方案2】:

在 popoverController 中显示 imagePicker 控制器(在 iPad 的情况下)。这不会给你那个错误。

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker];
[popover presentPopoverFromRect:self.selectedImageView.bounds inView:self.selectedImageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.popOver = popover;
} 
else {
[self presentModalViewController:picker animated:YES];
}

最好的问候。

【讨论】:

【解决方案3】:

我的猜测是 cameraPicker 实例没有正确分配/释放。尝试在您的 - (void)takePhotoWithCamera 方法中创建 cameraPicker,而不是依赖先前创建的实例。您将在回调方法中获得选取器实例的句柄...

【讨论】:

    【解决方案4】:

    我遇到了同样的问题 - 我希望用户使用全屏视图拍照(即调用 presentViewController 并传递 UIImagePickerController 控制器实例)并从弹出窗口中选择现有照片(我使用 initWithContentViewController 将其与弹出窗口相关联)。我为相机和弹出框重用了相同的 UIImagePickerController 实例,如果我在打开弹出框之前尝试运行相机,它会抛出相同的异常。

    结果我导致了一个问题,我的解决方案只是拥有两个 UIImagePickerController 实例 - 一个用于相机(我从主视图中呈现),另一个用于弹出窗口。到目前为止它有效。 :-)

    不确定它是否仍然适用于原始海报,但希望它能帮助遇到此讨论的其他人。

    【讨论】:

      【解决方案5】:

      遇到了和你一样的麻烦,最后根据@CainaSouza 的回答得到了解决方案。我一直在使用 Xamarin.iOS,所以我会用 C# 来回答,但它可以很容易地转换为 Objective-C。

      我使用与@CainaSouza 相同的代码来调用控制器:

      UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController (customController, true, null);
      

      然后我将以下代码添加到我的自定义RootViewController

      public override void PresentViewController (UIViewController viewControllerToPresent, bool animated, Action completionHandler)
      {
          if (PresentedViewController != viewControllerToPresent) {
              base.PresentViewController (viewControllerToPresent, animated, completionHandler);
          }
      }
      

      诀窍是检查你之前是否没有展示过那个 UIViewController。

      我知道这是一个老问题,但希望它对某人有所帮助。 :)

      【讨论】:

        猜你喜欢
        • 2011-12-25
        • 2014-03-03
        • 1970-01-01
        • 2018-08-24
        • 2013-01-06
        • 1970-01-01
        • 2017-10-13
        • 2017-09-02
        • 2020-06-06
        相关资源
        最近更新 更多