Excepción en iPad, UIImagePickerController debe presentarse a través de UIPopoverController

He creado una aplicación para capturar imágenes de la camera. Este es mi codigo

-(IBAction) showCameraUI { BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; UIImagePickerController* picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = hasCamera ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:picker animated:YES]; } 

Y implementó este método delegado para get la image capturada

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissModalViewControllerAnimated:YES]; UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage]; UIImage *yourImageView = image; } 

Implementé este método si el usuario cancela el controller

 - (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker { [picker dismissModalViewControllerAnimated:YES]; } 

Pero muestra esta exception. ¿Alguien tiene alguna idea de por qué muestra dicha exception después de ejecutar la última línea de function showCameraUI.

 UIStatusBarStyleBlackTranslucent is not available on this device. 2013-02-07 10:06:06.976 CaptureImage[460:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController' 

Con respecto a la exception, el post de error es muy claro. "En iPad, UIImagePickerController debe presentarse a través de UIPopoverController" Para iPad, debe presentarlo en un UIPopoverController lugar de utilizar [self presentModalViewController:picker animated:YES]; . Esto debería solucionar el problema.

Por ejemplo:

 if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker]; [popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; self.popover = popover; } else { [self presentModalViewController:picker animated:YES]; } 

Editar: como lo menciona @rmaddy, la camera se puede presentar de manera modal. Lo anterior es aplicable cuando sourceType es UIImagePickerControllerSourceTypePhotoLibrary .

@Arun, también tengo el mismo problema de agregar propiedad global en el file de encabezado.

Espero que el siguiente código te sea útil.

 UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init]; [imgPicker setDelegate:self]; [imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; [imgPicker setAllowsEditing:YES]; [imgPicker setModalPresentationStyle:UIModalPresentationCurrentContext]; UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:imgPicker]; popOver.delegate = self; self.popoverImageViewController = popOver; [self.popoverImageViewController presentPopoverFromRect:CGRectMake(0, 0, 160, 40) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

En ese file de encabezado, cree una propiedad global como esta

 @property (strong) UIPopoverController *popoverImageViewController;