DidFinishPickingMediaWithInfo NOT Called Swift

У меня есть кнопка UITableViewCell, чтобы взять изображение и поместить его обратно в ячейку. Когда я вызываю UIImagePickerController и беру изображение, он не вызывает следующий делегат

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

Это моя функция takePhotoFunction в 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)}

Ответ 1

В Swift 3 этот метод делегата теперь называется:

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

Различия заключаются в следующем:

  • Существует подчеркивание _ перед сборщиком
  • тип информации в конце изменяется от [String: AnyObject] до [String: Any]

У меня была такая же проблема, и когда я сделал эти изменения, она сработала.

Ответ 2

1. Не забудьте добавить UIImagePickerControllerDelegate,UINavigationControllerDelegate
2. В вашем viewDidLoad() добавьте picker.delegate = self
3. Добавьте методы делегата

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)
}

Надеюсь, поможет :)

Ответ 3

Для быстрой 4.2

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

Ответ 4

Используйте метод ниже для Swift 4.2:

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

Ответ 5

Для Swift 4.2

Этот метод переименован и теперь должен вызываться, как показано ниже. У меня была та же проблема, что этот метод делегата не вызывал, но после этого моя проблема была решена.

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

}

Ответ 6

для SWIFT 4.2

У меня была похожая проблема, когда методы делегата не вызывались программой.

imagePicker.delegate = self должно быть НЕ в методе viewDidLoad(), а в методе, который открывает галерею. Как это:

func openGallery()
    {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self

        imagePicker.sourceType = .photoLibrary

        self.present(imagePicker, animated: true, completion: nil)
   }

Ответ 7

Вы должны использовать этот метод таким образом, так как не существует метода делегата, который вы объявили:

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

Ссылка на документ Apple: https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIImagePickerControllerDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIImagePickerControllerDelegate/imagePickerController:didFinishPickingMediaWithInfo:

Ответ 8

Теперь метод делегата называется func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])

Я вижу, что ваш imagePickerController.delegate правильно установлен, поэтому я предполагаю, что вы случайно поставили код didFinishPickingMediaWithInfo вне класса ViewController

Ответ 9

С Swift 5 у нас небольшое обновление.

Вот один пример экрана, который я создал, чтобы проверить это с iOS 12.2

import UIKit
import UIKit


class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    //MARK: Open Photos Galley Button Action method
    @IBAction func openPhotosGallery(_ sender: Any) {

        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            let myPickerController = UIImagePickerController()
            myPickerController.delegate = self;
            myPickerController.sourceType = .photoLibrary
            self.present(myPickerController, animated: true, completion: nil)
        }
    }

    //MARK: ImagePicker Controller Delegate methods
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        self.dismiss(animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let chosenImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
        imageView.image = chosenImage
        dismiss(animated:true, completion: nil)
    }
}