-(id)initInView:(UIViewController*)display{
Certo, e o que ela faz com esse display recebido? vamos com calma... primeiramente vemos que a classe de implementação "MyPicture.m" cria em sua inicialização um objeto do tipo UIImagePickerController, que é a classe da API que efetivamente desenha a janela para escolha de uma foto. Tendo o objeto armazenado na variável chamada "picker", apontamos o delegate da janela para a nossa classe que estamos criando.
showIn = display;
UIImagePickerController *picker = [[UIImagePickerController alloc]init];
picker.delegate = self;
Atenção!
1. picker.sourceType define qual a origem permitida da foto, no caso estamos recuperando a foto a partir da biblioteca de fotos.
2. picker.allowsEditing define se a foto depois de adquirida pode ser redimensionada.
Agora vem a parte mais importante, onde utilizamos efetivamente o delagete:
[showIn presentModalViewController:picker animated:YES];
Aqui apresentamos a janela, utilizando animação, mas e esse showIn? ele é o display que recebemos como parâmetro, é nesse display que a janela de busca por uma foto deverá aparecer.
Agora que a janela de escolha já está visível, temos a possíbilidade de selecionar uma foto ou cancelar, na primeira opção ao terminar de escolher uma foto a janela irá chamar o método didFinishPickingImage do seu delagate e no segundo caso irá chamar o método imagePickerControllerDidCancel. Mas repare que a nossa classe MyPicture é que é o delegate da janela, portanto são os nossos métodos que serão chamados e dentro de cada um deles, após efetuarmos as ações necessárias, devemos remover a janela de busca com:
[pickerRec.parentViewController dismissModalViewControllerAnimated:YES];
Observem que no método imagePickerControllerDidCancel nós apenas removemos a janela, mas no didFinishPickingImage nós chamamos um método updatePicture e repassamos a imagem recebida como parâmetro para o nosso delegate.
Cuidado! Repare que o delagete da classe UIImagePickerController é a nossa classe, e o delegate da nossa classe é uma outra classe que deve ser definida antes de sua utilização.
E se a classe que vai criar um objeto MyPicture e se configurar como sendo o delegate não tiver um método updatePicture para ser chamado? Ela vai ter que ter um, pois na declaração do "MyPicture.h" nós definimos que qualquer classe que queira se candidatar a ser um delegate de MyPicture, deve conter o método "updatePicture", esta configuração foi feita no seguinte trecho:
@protocol MyPictureDelegate
-(void)updatePicture:(UIImage*)image;
@end
Continua...
MyPicture.h
#import@protocol MyPictureDelegate -(void)updatePicture:(UIImage*)image; @end @interface MyPicture : UIViewController { id showIn; id delegate; } -(id)initInView:(UIViewController*)display; @property (nonatomic, retain) id showIn; @property (nonatomic, retain) id delegate; @end
MyPicture.m
#import "MyPicture.h" @implementation MyPicture @synthesize showIn,delegate; -(id)initInView:(UIViewController*)display{ showIn = display; UIImagePickerController *picker = [[UIImagePickerController alloc]init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.allowsEditing = YES; [showIn presentModalViewController:picker animated:YES]; [picker release]; return self; } - (void)imagePickerController:(UIImagePickerController *)pickerRec didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{ [pickerRec.parentViewController dismissModalViewControllerAnimated:YES]; [delegate updatePicture:image]; } -(void)imagePickerControllerDidCancel:(UIImagePickerController *)pickerRec{ [pickerRec.parentViewController dismissModalViewControllerAnimated:YES]; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { printf("//my picture dealloc//"); [super dealloc]; } @end