Los problemas con el button de cancelación de UIImagePickerController no funcionan

Tengo una aplicación universal que permite seleccionar una image de la biblioteca de fotos del dispositivo para su posterior manipulación, el código funciona bien en el iPad, pero no sucede nada en el iPhone, ni siquiera el button cancelar y después de que se selecciona una image no ocurre nada. mi código:

-(IBAction)grabImage:(id)sender { if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) { imgPicker = [[UIImagePickerController alloc] init]; [imgPicker setDelegate:self]; popover = [[UIPopoverController alloc] initWithContentViewController:imgPicker]; [popover setDelegate:self]; CGPoint position = [view1.superview convertPoint:view1.frame.origin toView:nil]; CGRect popOverFrame = CGRectMake( position.x, position.y, self.view.frame.size.width, self.view.frame.size.height ); [popover presentPopoverFromRect:popOverFrame inView:self.view permittedArrowDirections:nil animated:NO]; [popover setPopoverContentSize:CGSizeMake(320, 480)]; [imgPicker release]; } else { imgPicker = [[UIImagePickerController alloc] init]; imgPicker.delegate = self; imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentModalViewController:self.imgPicker animated:YES]; [imgPicker release]; } } -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { pickedImage = [info objectForKey:UIImagePickerControllerOriginalImage]; CGImageRef imgRef = pickedImage.CGImage; app->setImage( pickedImage, CGImageGetWidth(imgRef), CGImageGetHeight(imgRef) ); [[picker parentViewController] dismissModalViewControllerAnimated:YES]; // Enable texture siwth after an image has been loaded [textureSwitch setEnabled:YES]; [textureSwitch setOn:YES]; app->isTextureDrawingOn = [textureSwitch isOn]; [fillsSwitch setOn:NO]; app->isFillsDrawingOn = [fillsSwitch isOn]; if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) { [popover dismissPopoverAnimated:YES]; } ofLog(OF_LOG_VERBOSE, "cancel after selection"); } -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [[picker parentViewController] dismissModalViewControllerAnimated:YES]; if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) { [popover dismissPopoverAnimated:YES]; } ofLog(OF_LOG_VERBOSE, "did cancel"); } 

En lugar de usar el siguiente código.

 [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 

Prueba este codigo

 [self dismissModalViewControllerAnimated:YES]; 

y también comprobó que agregó UIImagePickerControllerDelegate en su file de interfaz.

SOLUCIÓN: (De mi comentario)

Pruebe esto [self.imgPicker dismissModalViewControllerAnimated:YES]; Esto funcionara

Para iOS 7: para descartar un controller de vista actual

 [self.imgPicker dismissViewControllerAnimated: YES completion: NULL]; 

Agregue UIImagePickerControllerDelegate en su file de interfaz

y luego implementa este código en tu file .m

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

Espero que resuelva tu problema.

compruebe la vista Parpadeará o visualizará los methods de aplicación de su controller primario que llama al selector. En el iPhone, estos methods se llamarán después de que desaparece la vista del selector. No se llamarán después de que el popover desapareció en el iPad. Acabo de encontrar un error en mi código donde establezco nil a ivar para la image seleccionada en viewWillAppear. me toma dos días entender lo que pasó;) ¡Buena suerte!

Una solución más fácil:

Agregue UIImagePickerControllerDelegate en su file de interfaz

y luego implementa este código en tu file .m

 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [picker dismissViewControllerAnimated:YES completion:nil]; } 

Para cerrarlo en Swift:

Después de agregarle esos protocolos ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate

 internal func imagePickerControllerDidCancel(picker: UIImagePickerController){ dismissViewControllerAnimated(true, completion: nil) } 

Swift 3.0

Gracias a MBH esto me funcionó en mi proyecto Xcode 8 y iOS 10:

 internal func imagePickerControllerDidCancel(_ picker: UIImagePickerController){ dismiss(animated: true, completion: nil) }