UIImagePickerController在alloc / init上崩溃

时间:2012-05-22 13:24:46

标签: ios ipad uiimagepickercontroller

我有一个UIImagePickerController,当用户按下按钮时,我会在弹出框中显示。这在iPad模拟器中完全正常,但是当我尝试在实际测试设备上做同样的事情时,我在图像选择器的alloc / init行上得到NSRangeException

    imagePicker = [[UIImagePickerController alloc] init];//Crashes here on device
    imagePicker.delegate = self;
    imagePicker.allowsEditing = YES;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) (kUTTypeImage), nil];

以下是崩溃消息:

  

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [NSOrderedSet initWithOrderedSet:range:copyItems:]:range {8,1}超出了bounds [0 .. 0 ]'

我已经通过尝试在调试模式中跳过该行来确定它是确切的行,并且跨越该特定行是导致异常被抛出的原因。

编辑:

我能够制作一个100%重现此问题的基本项目,这让我相信这是一个iOS错误,而不是我的代码。

  1. 制作一个新项目。选择单视图应用程序。无论是故事板还是基于xib的
  2. 都无关紧要
  3. 打开iPad xib /情节提要板,在视图中添加一个圆形按钮
  4. 将以下IBAction添加到viewcontroller。 pickerPopoverController__strong ivar

    -(void)iMakeItCrash:(UIButton*)sender
    {
        UIImagePickerController* ip = [[UIImagePickerController alloc] init];
        ip.delegate = self;
        ip.allowsEditing = YES;
        ip.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        ip.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) (kUTTypeImage), nil];
    
        pickerPopoverController = [[UIPopoverController alloc] initWithContentViewController:ip];
        [pickerPopoverController presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
    
  5. 将此IBAction连接到按钮的Touch Up Inside事件。

  6. 适用于模拟器,在iPad上崩溃
  7. EDIT2:

    如果我尝试使用presentPopoverFromBarButtonItem:,仍然会发生崩溃。但是,如果我根本不提供图像选择器,则不会崩溃...

2 个答案:

答案 0 :(得分:2)

当我的应用程序在我的任何设备或模拟器上的空白“已保存照片”相册中崩溃时,我注意到了这一点。如果保存的照片中有照片,则不会发生错误。如果您在模拟器上使用“重置数据和设置”,则很容易复制,并将您的相册留空。

我花了很多年时间试图找到一种解决方法,但我无法做到。我认为提交iOS错误报告是一个真正的好主意。

答案 1 :(得分:0)

我遇到了同样的问题并用波纹管代码修复:

-(IBAction)actionOpenPhotoLibrary:(id)sender
{
if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]){
    return;
}

if ([popover isPopoverVisible]) {
    [popover dismissPopoverAnimated:YES];
    return;
}

UIImagePickerController *imagePicker = [[[UIImagePickerController alloc] init]autorelease];
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
imagePicker.delegate = self;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){

    popover = [[UIPopoverController alloc] initWithContentViewController:imagePicker];              
    popover.delegate = self;
    [popover setPopoverContentSize:CGSizeMake(320, 460)];
    [popover presentPopoverFromBarButtonItem:[[[UIBarButtonItem alloc]initWithCustomView:(UIButton*)sender] autorelease] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

imagePicker.navigationBar.tintColor = APP_THEME_COLOR;
[self presentModalViewController:imagePicker animated:YES];
}

祝你好运.......