我有一个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错误,而不是我的代码。
将以下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];
}
将此IBAction连接到按钮的Touch Up Inside事件。
EDIT2:
如果我尝试使用presentPopoverFromBarButtonItem:
,仍然会发生崩溃。但是,如果我根本不提供图像选择器,则不会崩溃...
答案 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];
}
祝你好运.......