目标c -应用程序试图以模式呈现一个活动控制器:UIImagePickerController



我已经为此挣扎了2天,我认为这是我应该寻求帮助的时刻。在我搜索了一段时间后,没有任何答案可以解决我的问题。这是我的申请……

在应用程序中,

  • 设备为iPad, iOS 6
  • RootViewController是NavigationController
  • TopViewController是TabBarController
  • 在这个标签栏控制器中,我从导航栏的右栏按钮呈现了一个弹出窗口控制器
  • 在呈现弹出窗口有一个按钮,允许用户从新的或从现有的选择图像。
  • 选择新的,我presentViewController UIImagePickerController允许用户用设备相机拍照。presentModalViewController:animated: if iOS <6、和presentViewController:animated:completion: for iOS> 6
  • 我还隐藏状态栏前的演示
  • 从现有的照片中选择,我做presentPopoverFromBarButtonItem:permitArrowDirections:animated:
  • PopoverViewController也被TabBarController引用

问题在这里

  • Present UIImagePickerController将总是失败,如果用户尝试先选择一个新的,异常"应用程序试图以模式呈现一个活动控制器<[name of view controller that try to Present]>"
  • BUT,如果用户尝试一次从相机胶卷中取出图像,然后再次尝试拍摄新的图像,它不会失败。

这是我尝试过的

  • present from RootViewController
  • 显示自TopViewController (TabBarController)
  • present from popoverViewController本身
  • 显示在TabBarController
  • 的选项卡中
  • 在显示前隐藏popoverViewController
  • resignFirstResponder from a textField in 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];
    }
}

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

遇到了和你一样的麻烦,最后根据@CainaSouza的答案找到了解决方案。我一直在和沙玛林合作。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。

我知道这是一个古老的问题,但希望它能帮助别人。:)

在弹出窗口控制器中呈现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];
}

问好。

你试过这样展示吗?

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

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

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

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

不确定它是否仍然是真实的原始海报,但希望它能帮助其他遇到这个讨论的人。

最新更新