尝试在iPhone上以模态方式呈现UIImagePickerController时崩溃

时间:2013-11-26 16:58:12

标签: ios objective-c uiimagepickercontroller exc-bad-access

当我尝试从特定视图控制器呈现UIImagePickerController时,我的应用程序崩溃了。

我有一个对象CLYImagePickerController,用于处理UIImagePickerController的简单事物,例如创建,呈现和处理UIAlertView,为用户提供哪种选项UIImagePickerController呈现,并处理用户的图像选择。该对象告诉委托视图控制器使用以下方法呈现UIImagePickerController

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
    imagePickerController.sourceType = sourceType;
    imagePickerController.delegate = self;

    [self.delegate presentViewController:imagePickerController animated:YES completion:nil];
}

编辑2013年11月27日: self是第二段中描述的CLYImagePickerController。它只是一个NSObject子类。 CLYImagePickerController的{​​{1}}按以下方式定义:

delegate

@property (weak, nonatomic) UIViewController <CLYImagePickerControllerDelegate> *delegate; 的目的是允许视图控制器(CLYImagePickerController)调用它来在视图控制器的视图中显示一个操作表,该操作表在被操作时可以调用{ {1}}其来源类型由点按的操作表按钮确定。基本上,delegate处理一堆重复的代码,否则会混淆UIImagePickerController视图控制器的代码,并允许在使用图像选择器的整个应用程序中使用统一的呈现方式。


对于特定的视图控制器,由于它处理CLYImagePickerController以及delegate的许多方面,因此它很大,呈现UITableView源类型UITextView几乎每次都会导致应用程序崩溃UIImagePickerController异常(有一些罕见的情况,当应用程序启动时应用程序不会崩溃,但重建而不对项目进行任何更改通常会反转此操作并且应用程序将再次开始崩溃)。同样,我认为重要的是要强调,只有在显示源类型为UIImagePickerControllerSourceTypePhotoLibrary的{​​{1}}时才会出现呈现源类型EXC_BAD_ACCESS { {1}}发布就好了。

我从帖子底部的其中一个崩溃中提供了崩溃日志。

为了确保问题不在我的UIImagePickerController对象中,我使用空视图控制器对其进行测试,该控制器的唯一功能是充当UIImagePickerControllerSourceTypePhotoLibrary的委托。在此视图中,UIImagePickerController每次都会正确启动两种源类型。这让我相信在有问题的视图控制器代码中有某些东西会以某种方式干扰UIImagePickerControllerSourceTypeCamera,但我不知道它可能是什么。还有其他人有类似的问题可以解释这个问题吗?

奇怪的是,在测试视图中启动具有照片库源类型的选择器之后,问题视图控制器能够呈现具有照片库源类型的选择器而没有任何问题。当我第一次提供源类型为CLYImagePickerController的{​​{1}}并允许我再次呈现它而没有问题视图控制器中的问题时,是否全局设置了某些内容?

崩溃日志

以下是其中一个崩溃的示例堆栈跟踪。我真的不知道这一切意味着什么。似乎有某种问题在某处访问与字体相关的内容?我不知道。

CLYImagePickerController

2 个答案:

答案 0 :(得分:1)

这个怎么样:

- (void) showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{    
    if ([UIImagePickerController isSourceTypeAvailable:sourceType])
    {
        UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
        imagePickerController.sourceType = sourceType;
        imagePickerController.delegate = self;
        [self.delegate presentModalViewController:imagePickerController animated:NO]; 
        // if this doesn't work try using:
        // if ([self.providerDelegate respondsToSelector:@selector(showImagePicker:)]) {
        //    [self.providerDelegate performSelectorOnMainThread:@selector(showImagePicker:)
        //                                            withObject:imagePickerController
        //                                         waitUntilDone:NO];
        //}
    }
}

答案 1 :(得分:0)

我认为这是一个与加载某些字体相关的已知Apple漏洞。这是一个解决方法:

https://devforums.apple.com/message/930568#930568