Search code examples
iosswiftuiimagepickercontrollerios12

How do I use the updated UIImagePickerControllerDelegate iOS 12 API?


How do I use the updated UIImagePickerControllerDelegate API since it changed to [UIIMagePickerController.InfoKey : Any]? This part has been updated. I also searched here and I could not find an answer.

import UIKit

class adicionarNovoItemVc: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var textFieldNome: UITextField!
    let imagePicker = UIImagePickerController()
    @IBOutlet weak var namePreview: UILabel!
    @IBOutlet weak var imagePreview: UIImageView!
    let picker = UIImagePickerController()

    @IBAction func botaoAdcFoto(_ sender: UIButton) {
        picker.allowsEditing = true
        picker.delegate = self
        present(picker, animated: true)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true)
    }

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

Update:

After updating the didFinishPickingMediaWithInfo delegate to :

private func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[.originalImage] as! UIImage? {
        self.imagePreview.image = image

        self.picker.dismiss(animated: true, completion: nil)
    }
}

I now get:

Cannot downcast from 'Slice>' to a more optional type 'UIImage?'


Solution

  • It's not really much different. In iOS 12, lots of the old constants names have been refactored.

    Instead of the old key UIImagePickerControllerOriginalImage you now use UIImagePickerController.InfoKey.originalImage:

    Something like:

    let image = info[UIImagePickerControllerOriginalImage]
    

    now becomes:

    let image = info[.originalImage]
    

    See the related documentation for UIImagePickerController.InfoKey.

    Update:

    You made several mistakes in your attempted didFinishPickingMediaWithInfo. You need:

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