Ningún error después de elegir la image en el iPad (funciona en iPhone)

Mi aplicación está siendo rechazada de iTunes debido a problemas con el iPad, usando la camera, cuando uso la biblioteca de fotos. Por alguna razón, se bloquea en el método didFinishPickingMediaWithInfo. Funciona bien con el iPhone, pero no estoy seguro de por qué no funciona en el iPad.

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { if(picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary) { //Crashing here -> "fatal error: unexpectedly found nil while unwrapping an Optional value" var selectedImage: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage appraisalPic.backgroundColor = UIColor.blackColor(); appraisalPic.image = selectedImage self.dismissViewControllerAnimated(true, completion: nil) } 

introduzca la descripción de la imagen aquí

Use el código que figura a continuación en lugar de arriba, es posible que lo ayude.

  func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { if(picker.sourceType == UIImagePickerControllerSourceType.PhotoLibrary) { let url: NSString = info[UIImagePickerControllerReferenceURL] as NSString var imageName:String = url.lastPathComponent let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) { if paths.count > 0 { if let dirPath = paths[0] as? String { let readPath = dirPath.stringByAppendingPathComponent(imageName) var pickedimage = UIImage(CGImage: UIImage(contentsOfFile: readPath)!.CGImage, scale: 1.0, orientation: .Up) appraisalPic.backgroundColor = UIColor.blackColor(); appraisalPic.image = pickedimage } } } } 

Los lockings se producen porque está forzando el desenvolvimiento de un valor opcional en la siguiente línea:

 var selectedImage: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage 

Intenta reescribir tu código de la siguiente manera:

 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage where picker.sourceType == .PhotoLibrary else { return } appraisalPic.backgroundColor = UIColor.blackColor() appraisalPic.image = selectedImage self.dismissViewControllerAnimated(true, completion: nil) } 

BTW: ¿Estás configurando picker.sourceType correctamente?

 let picker = UIImagePickerController() override func viewDidLoad() { super.viewDidLoad() // ... picker.sourceType = .PhotoLibrary // ... } 

Lea también la Guía de estilo Swift de GitHub , especialmente Evite usar la fuerza de desenvolver opciones .

En el iPad, debes presentar el selector de imágenes usando presentViewController

Aquí está mi código Obj-c para presentar en iPhone y iPad.

 -(void)userPhotoLibrary{ UIImagePickerController *p; p = [[UIImagePickerController alloc]init]; if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { [p setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; [p setDelegate:self]; p.allowsEditing = YES; [self presentViewController:p animated:YES completion:nil]; }else{ NSString *alertTitle = NSLocalizedString(@"NoPhotosAlertTitle", @"The photos are not available title"); NSString *alertMessage = NSLocalizedString(@"NoPhotosAlertMessage", @"The photos are not available message"); NSString *alertContinue = NSLocalizedString(@"NoPhotosAlertContinueButton", @"The photos are not available continue button label"); UIAlertController *alert = [UIAlertController alertControllerWithTitle:alertTitle message:alertMessage prefernetworkingStyle:UIAlertControllerStyleAlert]; UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:alertContinue style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {}]; [alert addAction:defaultAction]; [alert addAction:cancelAction]; [self presentViewController:alert animated:YES completion:nil]; } }