iPhone UIImagePickerController didFinishPickingImage: transferência UIImage entre controladores de vista?

StackOverflow https://stackoverflow.com/questions/664717

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.

Foi útil?

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top