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

Tar*_*w45 5 objective-c uiimagepickercontroller presentmodalviewcontroller ios5 ios6

我在这方面奋斗了2天,并且相信这是我应该寻求帮助的那一刻.在我搜索SOF一段时间后,没有任何答案可以解决我的问题.这是我的申请......

在申请中,

  • 设备是iPad,iOS 6
  • RootViewController是NavigationController
  • TopViewController是TabBarController
  • 在这个TabBarController中,我从导航栏的右侧栏按钮呈现一个popoverController
  • 在呈现弹出窗口时,有一个按钮,允许用户通过拍摄新图像或从现有图像中选择图像.
  • 为了选择新的,我提出了ViewController UIImagePickerController以允许用户使用divice相机拍照.presentModalViewController:animated:如果iOS <6,并且presentViewController:animated:completion: for iOS> 6
  • 我还会在演示前隐藏状态栏
  • 要从现有照片中进行选择,我会使用presentPopoverFromBarButtonItem:permitArrowDirections:animated:
  • PopoverViewController也由一个TabBarController引用

这是问题所在

  • 如果用户首先尝试选择新的UIImagePickerController,则当前UIImagePickerController将始终失败,异常"应用程序尝试以模态方式呈现活动控制器<[尝试呈现的视图控制器的名称]>"
  • 但是,如果用户尝试从相机胶卷中选择一次图像然后尝试再次拍摄新图像,则不会失败.

这是我试过的

  • 来自RootViewController
  • 来自TopViewController(TabBarController)的礼物
  • 来自popoverViewController本身
  • 从TabBarController的选项卡中显示
  • 在演示之前隐藏popoverViewController
  • 来自popoverViewController中textField的resignFirstResponder

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

// 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*ana 9

遇到了比你更多的麻烦,最终得到了基于@ CainaSouza答案的解决方案.我一直在使用Xamarin.iOS,所以我将在C#中回答,但它可以很容易地转换为Objective-C.

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

UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController (customController, true, null);
Run Code Online (Sandbox Code Playgroud)

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

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

诀窍是检查你之前是否没有提供过UIViewController.

我知道这是一个老问题,但希望它会帮助某人.:)


Cai*_*uza 2

您尝试过这样呈现吗?

[self.view.window.rootViewController presentModalViewController:cameraPicker animated:YES];
Run Code Online (Sandbox Code Playgroud)