问题
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