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

时间:2013-03-01 11:47:30

标签: objective-c ios5 ios6 uiimagepickercontroller presentmodalviewcontroller

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

在应用程序中,

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

这是问题

  • 目前UIImagePickerController将始终失败,如果用户尝试首先选择新的“应用程序尝试以模态方式呈现活动控制器&lt; [尝试呈现的视图控制器的名称]&gt;” < / LI>
  • 但是,如果用户尝试从相机胶卷中选择一次图像,然后尝试重新拍摄新图像,则不会失败。

以下是我试过的内容

  • 来自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];
    }
}

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

5 个答案:

答案 0 :(得分:8)

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

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

Advanced

然后我将以下代码添加到我的自定义<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:FIXML="fixprotocol.org/FIXML-4-4" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="FIXML msxsl"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@* | node()"> <xsl:apply-templates select="@* | node()"/> </xsl:template> <xsl:variable name="checkData"> <data>Hdr</data> <data>Insert1</data> <data>Insert2</data> </xsl:variable> <xsl:template match="FIXML:Main"> <Main> <xsl:variable name="temp" select="//*"/> <xsl:for-each select="msxsl:node-set($checkData)/*"> <xsl:choose> <xsl:when test="count($temp[local-name(.)=current()]) &gt;= 1"> <xsl:copy-of select="$temp[local-name(.)=current()]"/> </xsl:when> <xsl:otherwise> <xsl:element name="{current()}"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </Main> </xsl:template>

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

诀窍是检查你之前是否还没有出现过UIViewController。

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

答案 1 :(得分: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];
}

最诚挚的问候。

答案 2 :(得分:2)

你试过这样呈现吗?

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

我原来导致了一个问题,我的解决方案只是有两个UIImagePickerController实例 - 一个用于摄像头(我从主视图中呈现)和另一个用于弹出窗口。它到目前为止工作。 :-)

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