iPhone UIImagePickerController didFinishPickingImage: UIImage передача между контроллерами представления? - PullRequest
4 голосов
/ 20 марта 2009

В моем приложении у меня есть UIImagePickerController. Когда изображение выбрано, мой контроллер представления должен получить изображение и передать его другому контроллеру представления, который помещается в self.navigationController. Но я всегда получаю SEGFAULTS или ноль аргументов и тому подобное. Буду признателен, если вы скажете мне, что не так с этим кодом:

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];
}

У обоих есть currentpicture, определенный как UIImage * currentpicture;
Теперь я должен иметь текущую картинку в виде некоторых данных, но она каждый раз вылетает! Я пробовал много разных вещей, и я не могу понять это.

Ответы [ 2 ]

6 голосов
/ 20 марта 2009

Поправьте меня, если я ошибаюсь, но UIImage не соответствует NSCopying, поэтому вы не можете успешно скопировать его.

Что вы, вероятно, хотите сделать, это сохранить изображение. Если self.currentpicture является свойством 'retain', оно автоматически освободит предыдущий объект и сохранит новый, поэтому просто сделайте это:

self.currentpicture = img;

В противном случае сделайте это сами:

[self.currentpicture release];
self.currentpicture = [img retain];

В обоих случаях вам все равно придется вызывать [self.currentpicture release], когда вам больше не нужно изображение. Обычно вы делаете это в методе dealloc объекта «self».

0 голосов
/ 20 марта 2009

Один из способов обмена данными между различными классами контроллера представления - через делегат приложения.

Например, вы можете определить UIImage *currentPicture в делегате приложения, а затем получить доступ к обоим классам контроллера представления следующим образом:

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication]delegate];
UIImage *i = [appDelegate.currentPicture];
...