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:
- Hay un subrayado _ antes del selector
- 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 :)