ios uitableview swift uiimagepickercontroller

ios - didFinishPickingMediaWithInfo NO se llama Swift



uitableview uiimagepickercontroller (8)

Tengo un botón de UITableViewCell para tomar una imagen y volver a colocarla en la celda. Cuando llamo al UIImagePickerController y tomo la imagen, no llama al siguiente delegado

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject], sender:AnyObject)

Este es mi takePhotoFunction en el UITableViewController:

@IBAction func takePhoto(sender: AnyObject) { let imagePickerController = UIImagePickerController() imagePickerController.delegate = self imagePickerController.allowsEditing = true let actionSheet = UIAlertController(title: "Choose image souruce", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) actionSheet.addAction(UIAlertAction(title: "Take Image", style: UIAlertActionStyle.Default, handler: { (alert:UIAlertAction!) -> Void in imagePickerController.sourceType = UIImagePickerControllerSourceType.Camera self.presentViewController(imagePickerController, animated: true, completion: nil) })) actionSheet.addAction(UIAlertAction(title: "Photo Library", style: UIAlertActionStyle.Default, handler: { (alert:UIAlertAction!) -> Void in imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary self.presentViewController(imagePickerController, animated: true, completion: nil) })) actionSheet.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil)) self.presentViewController(actionSheet, animated: true, completion: nil)}


Debe utilizar ese método de esta manera ya que no hay ningún método de delegado que haya declarado:

func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:[NSObject : AnyObject]) { println("Calling") }

Referencia para el documento de Apple: https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerControllerDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIImagePickerControllerDelegate/imagePickerController:didFinishPickingMediaWithInfo .


El método delegado ahora se llama func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])

Veo que su imagePickerController.delegate está correctamente configurado, por lo que asumo que usted colocó accidentalmente el código didFinishPickingMediaWithInfo fuera de su clase ViewController


En Swift 3 , este método de delegado ahora se llama:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])

Las diferencias son:

  1. Hay un subrayado _ antes del selector
  2. El tipo de información al final se cambia de [String: AnyObject] a [String: Any]

Tuve el mismo problema y cuando hice estos cambios funcionó.


Para Swift 4.2

Este método ha cambiado de nombre y ahora debería llamarse como se muestra a continuación. Tuve el mismo problema que este método de delegado no llamaba, pero después de esto, mi problema se resolvió.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { }


Para swift 4.2

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let chosenImage = info[.originalImage] as? UIImage{ //use image } }


Utilice el siguiente método para Swift 4.2:

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){ }


para SWIFT 4.2

Tuve un problema similar cuando los métodos de delegado no fueron llamados por el programa.

El imagePicker.delegate = self debe estar en el método viewDidLoad () sino en el método que abre la galería. Me gusta esto:

func openGallery() { let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = .photoLibrary self.present(imagePicker, animated: true, completion: nil) }


1. No te olvides de agregar UIImagePickerControllerDelegate,UINavigationControllerDelegate
2. En su viewDidLoad() agregue picker.delegate = self
3. Añadir los métodos delegados.

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage userImageView.contentMode = .scaleAspectFit userImageView.image = chosenImage dismiss(animated:true, completion: nil) } public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {self.dismiss(animated: true, completion: nil) }

Espero eso ayude :)