2010-08-22 1 views
0

У меня есть приложение для iPhone.
Я показываю UIImagePicker и позволяю пользователю выбирать изображение.
Затем я выполняю код на изображении и хочу, чтобы этот код выполнял после UIImagePicker был уволен.Выполнить код/​​после/UIImagePicker отклоняется

EDIT: обновленный код, проблема остается:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSData* data = UIImagePNGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"]); 
    [[picker parentViewController] dismissModalViewControllerAnimated:TRUE]; 
    [self executeSomeCode: data]; 
} 

Однако, когда я запускаю код, он висит на UIImagePicker запустить свой код, а затем UIImagePicker визуально уволен после того, как указанный код имеет казнены.

Любые идеи?

+0

UIImagePickerControllerOriginalImage уже определен как 'NSString * const' (проверьте документы для UIImagePickerControllerDelegate). Вам не нужно класть его в кавычки. – thelaws

ответ

0

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImagePickerControllerDelegate_Protocol/UIImagePickerControllerDelegate/UIImagePickerControllerDelegate.html

Я считаю, что ваш звонок осуждался в iOS3

Вы можете попробовать

(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

и получить данные изображения перед отклоняя ViewController

NSData *data = UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"] , 1.0); 
[self dismissModalViewControllerAnimated:TRUE]; 
[self executeSomeCode:img]; 
+0

, а затем выполнить мой код после увольнения? – Origamiguy

+0

Я считаю, что вы теряете данные, когда вы увольняете диспетчер, если вы сначала получаете данные изображения, тогда я считаю, что проблемы уходят. Я получаю данные, манипулирую им .. а затем упускаю из вида –

+0

Нет, он не теряет данные, проблема в том, что он хочет, чтобы модальное представление imagepicker было отклонено до того, как код выполнит.Вероятно, он делает визуальную анимацию с изображением, которое он хочет видеть пользователем. Тем не менее, он должен использовать надлежащие методы делегирования. – thelaws

1

Я понимаю, что это не самый изящный из nswers. Раньше у меня были подобные проблемы (попытка визуальных действий в viewDidAppear, которая не работала). Я обнаружил, что, вызвав performSelector:withObject:afterDelay:, мои визуальные эффекты были видны.

Так что в вашем случае это будет:

[self performSelector:@selector(executeSomeCode:) withObject:data afterDelay:0]; 

Я понятия не имею, если это будет работать для вас (или почему он работал для меня).

0

Я не думаю, что вы вешаете, где вы думаете. Представление UIImagePNGR занимает довольно много времени, насколько я знаю (представление UIJPEGR намного быстрее, если вы не возражаете без потерь). Вы можете передать словарь в свой метод и получить нужный вам NSData.

Вторая проблема заключается в том, что ваш код является синхронным, независимо от того, как скоро вы сообщите своему диспетчеру об увольнении, он будет ждать вашего длинного кода для запуска. Чтобы запланировать ваш тяжелый код на следующей итерации цикла запуска и позволить диспетчеру быть уволенным, используйте 0ms delay для его выполнения.

Я хотел бы изменить свой код на этот:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
[[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
[self performSelector:@selector(executeSomeCode:) withObject:info afterDelay:0.0f]; 
} 
1

Это не должно быть необходимо использовать метод фона, но вы можете попробовать этот подход:

- (void)_processImage:(UIImage*)image 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    // convert to PNG data here, etc. 
    // this is background, remember to manipulate UI in main thread 
    // Example: [self.anImageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; 
    [pool release]; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
    UIImage *picked = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    [self performSelectorInBackground:@selector(_processImage:) withObject:[[picked retain] autorelease]]; 
}