UIImagePickerController在使用照片库作为来源时崩溃

5
我正在使用Xcode 5.1,在iOS7.1和7.0.2上测试了代码。在设备上使用UIImagePickerController会出现两种情况导致应用程序崩溃:
1)当将allowsEditing设置为YES时,我裁剪了一张图片并按“选择”按钮后,应用程序崩溃了。
2)在UIImagePickerController中,当我从照片列表返回到相册列表并且我在照片列表的底部时,它会崩溃(无论是否允许编辑)。请注意,如果我向上滚动照片列表,则不会崩溃。
这是我的代码:
- (IBAction)photoPickPressed:(id)sender {

    if ([self isPhotoLibraryAvailable]) {

        self.imagePicker = [[UIImagePickerController alloc] init];
        self.imagePicker.delegate = self;
        self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        self.imagePicker.allowsEditing = YES;
        NSString *requiredMediaType = (__bridge NSString*)kUTTypeImage;
        self.imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:requiredMediaType, nil];
        [self presentViewController:self.imagePicker animated:YES completion:nil];
    }
}

#pragma mark - image picker delegates
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [picker dismissViewControllerAnimated:YES completion:^(){
        NSLog(@"finished image picking");
    });
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    [picker dismissViewControllerAnimated:YES completion:nil];
}

崩溃信息如下:
* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSProxy doesNotRecognizeSelector:scrollViewDidScroll:] called!'
注意:如果我将allowsEditing设置为YES,则使用相机不会崩溃。 此外,它仅在真实设备上崩溃,而不是在模拟器上。
只是为了澄清(可能无关),最初我将imagePicker声明为
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

我的程序在调用控制器时出现了崩溃。经过大量搜索,我发现有篇文章说可能是因为控制器被回收了,建议在类定义中声明它。所以现在我已经在类定义中声明了它:

@property (strong, nonatomic) UIImagePickerController *imagePicker;

感谢您的提前帮助。
更新:我试图将imagePickerController的调用放在我的应用程序根视图中,但仍会出现相同的错误消息。 我不应该加载任何可滚动的视图。

奇怪的是使用了对象的代理而不是真实的对象。我想UIImagePickerController的NSProxy被用作替代,因此当它接收到scrollViewDidScroll消息时无法处理它。这可能只是某个更大、更明显问题的副产品。 - Infinity James
谢谢James!在你的提示下,我尝试创建了另一个新项目,上面的代码实际上可以正常运行。因此,我的原始应用程序中其他地方似乎有问题。你有任何提示在哪里开始调查原始应用程序吗? - Jiaqi
2个回答

0
经过数小时的调查和尝试,我确认这是由于一个第三方框架集成到应用程序中引起的:即使是空应用程序,如果我在那里链接该框架,也会导致UIImagePickerController崩溃。
感谢您的帮助!

1
你能告诉我们是哪个框架吗?我也遇到了同样的问题。 - iMack
是的,我也在使用那个,然后它就突然消失了。 - iMack
@Jiaqi,你是怎么找出是哪个框架的问题的?我没有使用那个框架,但是我也遇到了同样的崩溃。 - Dan F
@DanF 我尝试了蛮力方法... 基本上来自我最不熟悉的库... 抱歉这可能并没有什么帮助。 - Jiaqi

-1

我的建议是删除imagePickerController: didFinishPickingMediaWithInfo:方法。这是完全可选的,并且默认情况下会关闭图像选择器。

除此之外,我还建议:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [self dismissViewControllerAnimated:YES completion:nil];
}

根据文档,应该在呈现视图控制器上调用此方法:

呈现视图控制器负责关闭它所呈现的视图控制器。如果您在被呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器。


谢谢你的回复,詹姆斯。但我必须使用imagePickerController: didFinishPickingMediaWithInfo:来存储所选图片。我在这里只是简化了代码到一个NSLog(但肯定仍然会发生崩溃)。对于第二个问题,那样不会关闭我的视图,而是关闭呈现的imagePickerController吗? - Jiaqi
如果您需要结果图像,为什么didFinishPickingMediaWithInfo是不必要的?能否提供一个链接或引用来解释一下? - Dan F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接