UiImagePickerController faz com que meu aplicativo falhe!
-
27-09-2019 - |
Pergunta
No meu aplicativo, um usuário pode selecionar uma imagem, alterar a imagem de um UIImageView para o novo IMGE e salvar a imagem para nsuserDefaults usando o NSkeyedArchiver. Quando o usuário seleciona a imagem e o - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
é chamado, o aplicativo trava imediatamente! XCODE Recebe o erro: Sigabrt. Aqui está o meu código -
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
[picker dismissModalViewControllerAnimated:YES];
if ([[NSUserDefaults standardUserDefaults] integerForKey:@"PictureKey"] == 1) {
UIImage *previmage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[prevbutton setImage:previmage];
NSData *previmagedata = [NSKeyedArchiver archivedDataWithRootObject:previmage];
[[NSUserDefaults standardUserDefaults] setObject:previmagedata forKey:@"PrevImage"];
} else if ([[NSUserDefaults standardUserDefaults] integerForKey:@"PictureKey"] == 2) {
UIImage *nextimage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[nextbutton setImage:nextimage];
NSData *nextimagedata = [NSKeyedArchiver archivedDataWithRootObject:nextimage];
[[NSUserDefaults standardUserDefaults] setObject:nextimagedata forKey:@"NextImage"];
}else {
UIImage *optionsimage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[moreoptionsbutton setImage:optionsimage];
NSData *optimagedata = [NSKeyedArchiver archivedDataWithRootObject:optionsimage];
[[NSUserDefaults standardUserDefaults] setObject:optimagedata forKey:@"OptionsImage"];
}
}
E aqui está o meu erro.
wait_fences: failed to receive reply: 10004003
2010-04-16 18:09:25.012 iPimpYourMusicApp[2815:6807] Failed to save the videos metadata to the filesystem. Maybe the information did not conform to a plist.
2010-04-16 18:09:49.009 iPimpYourMusicApp[2815:207] *** -[UIImage encodeWithCoder:]: unrecognized selector sent to instance 0x1a1180
2010-04-16 18:09:49.016 iPimpYourMusicApp[2815:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIImage encodeWithCoder:]: unrecognized selector sent to instance 0x1a1180'
2010-04-16 18:09:49.026 iPimpYourMusicApp[2815:207] Stack: (
864992541,
859229716,
864996349,
864492313,
864454720,
854367759,
854367021,
854365681,
27619,
841224192,
857776904,
857868032,
857637052,
839607712,
839985680,
854089611,
864740547,
864738335,
875880904,
838872112,
838865456,
11173,
11068
)
terminate called after throwing an instance of 'NSException'
[Switching to thread 11779]
Program received signal: “SIGABRT”.
Não ria com o nome do meu aplicativo ser ipimpyourmusicapp - eu não tinha ideia do que nistá -lo, então brincei e o nomei que ... :) Obrigado antecipadamente!
Solução
Você não pode arquivar diretamente uma UIImage - o UIImage não implementa o NSCoding. Você tem que usar um dos UIImage[JPEG|PNG]Representation
para convertê -lo em um objeto nsdata.
Então você code seria:
UIImage *optionsimage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[moreoptionsbutton setImage:optionsimage];
[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(optionsimage) forKey:@"OptionsImage"];
Retirar a imagem exigiria o inverso:
UIImage *optImage = [UIImage imageWithData:[[NSUserDefaults standardUserDefaults] dataForKey:@"OptionsImage"]];
HTH!
-Tephen