使用PhotoLibrary作为源时,UIImagePickerController崩溃

时间:2014-03-21 06:57:09

标签: ios crash uiimagepickercontroller unrecognized-selector

我正在使用xcode 5.1并在ios7.1和7.0.2上测试了代码。该应用程序在设备的两种情况下与UIImagePickerController崩溃:

1)当allowsEditing设置为YES时,在我裁剪图片并按“选择”后,一旦它返回到我自己的视图,应用程序崩溃

2)在UIImagePickerController内,当我从照片列表返回到相册列表并且我在照片列表的底部时,它崩溃了(无论allowsEditing是否为是) 。请注意,如果我滚动照片列表,它不会崩溃。

这是我的代码:

- (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];
}

崩溃讯息是

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSProxy doesNotRecognizeSelector:scrollViewDidScroll:]调用!'

注意:即使我将allowsEditing设置为YES,如果我使用相机也会 NOT 崩溃。此外, ONLY 在真实设备上崩溃,而不是在模拟器上崩溃。

为了澄清(可能不相关),最初我将imagePicker声明为

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

,它崩溃了。所以我搜索了很多,并且帖子说控制器可能被回收,并建议在类定义中声明它。所以现在我在我的班级声明中宣布:

@property (strong, nonatomic) UIImagePickerController *imagePicker;

提前致谢。

更新:我甚至试图将imagePickerController的调用放到我的应用程序的根视图中,它仍然会崩溃同样的消息。我不应该加载任何可滚动的视图。

2 个答案:

答案 0 :(得分:0)

经过数小时的调查和试用后,我确认它是由集成到应用程序的第三方框架引起的:如果我在那里链接该框架,即使该空应用程序与UIImagePickerController崩溃。

感谢您的帮助!

答案 1 :(得分:-1)

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

除此之外,我还是建议:

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

    [self dismissViewControllerAnimated:YES completion:nil];
}

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

  

呈现视图控制器负责解除视图   它呈现的控制器。如果在显示的视图上调用此方法   控制器本身,它会自动将消息转发给   呈现视图控制器。