我正在使用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的调用放到我的应用程序的根视图中,它仍然会崩溃同样的消息。我不应该加载任何可滚动的视图。
答案 0 :(得分:0)
经过数小时的调查和试用后,我确认它是由集成到应用程序的第三方框架引起的:如果我在那里链接该框架,即使该空应用程序与UIImagePickerController
崩溃。
感谢您的帮助!
答案 1 :(得分:-1)
我的建议是删除imagePickerController: didFinishPickingMediaWithInfo:
方法。它完全是可选的,默认情况下将关闭图像选择器。
除此之外,我还是建议:
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[self dismissViewControllerAnimated:YES completion:nil];
}
根据文档,应该在呈现视图控制器上调用此方法:
呈现视图控制器负责解除视图 它呈现的控制器。如果在显示的视图上调用此方法 控制器本身,它会自动将消息转发给 呈现视图控制器。