5

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

在申请中,

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

这是问题

  • 如果用户尝试先选择新的 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];
    }
}

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

4

5 回答 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。

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

于 2015-07-31T07:51:59.950 回答
4

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

此致。

于 2013-03-06T08:11:15.930 回答
2

你试过这样呈现吗?

[self.view.window.rootViewController presentModalViewController:cameraPicker animated:YES];
于 2013-03-01T12:17:26.500 回答
1

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

于 2013-04-18T18:17:59.610 回答
0

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

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

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

于 2014-10-23T11:00:11.223 回答