J'ai un bouton UITableViewCell pour prendre une image et la replacer dans la cellule. Lorsque j'appelle UIImagePickerController et que je prends l'image, il n'appelle pas le délégué suivant.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject], sender:AnyObject)
Ceci est mon takePhotoFunction dans le 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)}
Dans Swift 3 , cette méthode de délégation s'appelle maintenant:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
Les différences sont:
J'avais le même problème et lorsque j'ai apporté ces modifications, cela a fonctionné.
1. N'oubliez pas d'ajouter UIImagePickerControllerDelegate,UINavigationControllerDelegate
2. Dans votre viewDidLoad()
, ajoutez picker.delegate = self
3. Ajouter les méthodes de délégué
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)
}
J'espère que ça aide :)
Pour Swift 4.2
Cette méthode a été renommée et devrait maintenant être appelée comme ci-dessous. J'ai eu le même problème que cette méthode de délégué n'appelait pas, mais après cela, mon problème a été résolu.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
}
Pour Swift 4.2
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let chosenImage = info[.originalImage] as? UIImage{
//use image
}
}
Utilisez la méthode ci-dessous pour Swift 4.2:
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
}
pour Swift 4.2
J'ai eu un problème similaire lorsque les méthodes de délégation n'étaient pas appelées par programme.
Le imagePicker.delegate = self
devrait êtrePASdans la méthode viewDidLoad () mais dans la méthode qui ouvre la galerie. Comme ça:
func openGallery()
{
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}
La méthode déléguée s'appelle maintenant func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
Je vois que votre imagePickerController.delegate
est correctement défini, donc je suppose que vous avez accidentellement mis le code didFinishPickingMediaWithInfo
en dehors de votre classe ViewController