iPhone UIImagePickerController didFinishPickingImage: transferência UIImage entre controladores de vista?
-
21-08-2019 - |
Pergunta
Em meu aplicativo, eu tenho um UIImagePickerController. Quando uma imagem for selecionada, o meu controlador de vista precisa para obter a imagem e passá-lo para outro controlador de vista, que é empurrado para self.navigationController. Mas eu estou sempre recebendo segfaults ou argumentos nulos, e coisas assim. Eu apreciaria se você poderia me dizer o que está errado com este código:
FirstViewController.m:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
self.currentpicture = [img copy];
[self dismissModalViewControllerAnimated:YES];
[self goNext];
}
-(void)goNext{
SecondViewController *vc = [[SecondViewController alloc] initWithNibName:@"Second" bundle:nil];
[vc giveMePicture:currentpicture];
[self.navigationController pushViewController:vc animated:YES];
}
SecondViewController.m:
-(void)giveMePicture:(UIImage *)data {
self.currentpicture=[data copy];
}
Ambos têm currentpicture definido como um UIImage * currentpicture;
Agora eu deve Have currentpicture como alguns dados, mas ele trava cada vez! Eu tentei muitas coisas diferentes e eu não posso descobrir isso.
Solução
me corrija se eu estiver errado, mas não UIImage não estão em conformidade com NSCopying, portanto, você não pode copiá-lo com sucesso.
O que você provavelmente quer fazer é manter a imagem. Se self.currentpicture é uma propriedade 'reter', ele vai liberar automaticamente o objeto anterior e reter o novo, então basta fazer isso:
self.currentpicture = img;
Caso contrário, faça você mesmo:
[self.currentpicture release];
self.currentpicture = [img retain];
Em ambos os casos, você ainda tem que chamar [a liberação self.currentpicture] quando você não precisa mais da imagem. Normalmente, você faria isso na 'self' método dealloc do objeto.
Outras dicas
Uma maneira de compartilhar dados entre diferentes classes do controlador visão é através do delegado do aplicativo.
Por exemplo, você poderia ter UIImage *currentPicture
definido em você aplicativo delegado e, em seguida, o acesso em ambos os de sua classe controlador de vista da seguinte forma:
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication]delegate];
UIImage *i = [appDelegate.currentPicture];