How do I use the updated UIImagePickerControllerDelegate iOS 12 API?

喜你入骨 提交于 2019-12-04 02:29:42

问题


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?'


回答1:


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



回答2:


You need to set the mediaTypes of the picker using the availableMediaTypes class func of UIImagePickerController and retrieve the actual image from the info parameter.

@IBAction func botaoAdcFoto(_ sender: UIButton) {
        picker.allowsEditing = true
        picker.delegate = self
        picker.sourceType = .photoLibrary
        if let mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary) {
          picker.mediaTypes = mediaTypes
        }

        present(picker, animated: true)
    }

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

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


来源:https://stackoverflow.com/questions/51182701/how-do-i-use-the-updated-uiimagepickercontrollerdelegate-ios-12-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!