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

5
我已经挣扎了两天,相信这是我应该寻求帮助的时刻。在搜索了一段时间后,没有任何答案能够解决我的问题。以下是我的应用程序...
在应用程序中,
- 设备为iPad,iOS 6 - RootViewController是NavigationController - TopViewController是TabBarController - 在这个TabBarController中,我从导航栏的右边按钮呈现一个popoverController - 在呈现popover时,有一个按钮允许用户通过拍摄新照片或从现有照片中选择来选择图像。 - 要选择新照片,我使用presentModalViewController:animated:(如果iOS <6)和presentViewController:animated:completion:(如果iOS> 6)呈现UIImagePickerController,以允许用户使用设备相机拍照。 - 我还在呈现之前隐藏状态栏。 - 要从现有照片中选择,我使用presentPopoverFromBarButtonItem:permitArrowDirections:animated:。 - PopoverViewController也由一个TabBarController引用。
以下是问题
- 如果用户先尝试选择新照片,则呈现UIImagePickerController将始终失败,并出现异常“Application tried to present modally an active controller <[name of view controller that try to present]>”。 - 但是,如果用户首先从相机胶卷中选择图像,然后再次尝试拍摄新的图像,它就不会失败。
以下是我尝试过的内容
- 从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];
    }
}

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


1
请看这里点击,或许有帮助。 - junkor
请告诉我们您在哪里解除了视图控制器(VC)。 - Daij-Djan
谢谢 @junkor,但是我已经读过那个了。事实是,在我发帖之前,我认为我已经阅读了所有与此相关的问题。现在,我决定清空我的思维,稍后回来重新进行整个过程,并看看会发生什么。 - Tar_Tw45
@Daij-Djan 当取消时没有错误,而是在呈现时出现了错误。我在取消代码处添加了一个断点,但它从未被触发。 - Tar_Tw45
你真的不想展示任何代码^^ - Daij-Djan
@Daij-Djan 抱歉,伙计,我很忙。我没有展示dismiss代码,因为在尝试呈现时它会崩溃。就像我说的那样,我在dismiss代码处添加了一个断点,但从未到达。 - Tar_Tw45
5个回答

9

我有和你一样的问题,最终根据@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。
我知道这是一个老问题,但希望它能帮助某些人。 :)

4
在iPad上,使用popoverController呈现imagePicker控制器。这样就不会出现那个错误了。
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];
}

最好的问候。


我知道presentPopover对于相机胶卷是可以的(因为我正在这样做),但对于设备相机也可以吗? - Tar_Tw45
1
嗨,有关更多详细信息,请查看苹果文档。http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerController_Class/UIImagePickerController/UIImagePickerController.html - Arun

2

你尝试过这样展示吗?

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

是的,我按照上面提到的做了。从RootViewController、TopViewController、PopoverViewController和TabBarController呈现的结果都是一样的。感谢您的建议。 - Tar_Tw45

1

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


0

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

结果证明这是个问题,我的解决方案很简单,就是使用两个UIImagePickerController实例 - 一个用于相机(我从主视图呈现),另一个用于弹出窗口。目前看起来还可以。:-)

不确定对于原始发布者是否仍然有效,但希望能帮助其他遇到这个讨论的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接