Проблема с Swift 4.2 imagePickerController

Пытаясь передать клиент чата с swift 4 на swift 4.2, я обнаружил проблемы с подборщиком.

UIImagePickerControllerEditedImage Невозможно присвоить значение типа «[String: Any]» индекс типа «UIImagePickerController.InfoKey»

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

    if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
        self.userProfileImage.contentMode = .scaleAspectFit
        self.userProfileImage.image = pickedImage
    }

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

person George Heints    schedule 15.08.2018    source источник


Ответы (5)


Сигнатура метода изменена на

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

Вы должны увидеть предупреждающее сообщение для имени функции

Метод экземпляра 'imagePickerController (: didFinishPickingMediaWithInfo :)' почти соответствует необязательному требованию 'imagePickerController (: didFinishPickingMediaWithInfo :)' протокола 'UIImagePickerControllerDelegate'

Кандидат имеет несовпадающий тип '(UIImagePickerController, [String: Any]) -> ()'

Переместите imagePickerController (_: didFinishPickingMediaWithInfo :) на другое расширение, чтобы отключить это предупреждение.

Сделайте imagePickerController (_: didFinishPickingMediaWithInfo :) закрытым, чтобы отключить это предупреждение

Требование 'imagePickerController (_: didFinishPickingMediaWithInfo :)' объявлено здесь (UIKit.UIImagePickerControllerDelegate)

person Ashley Mills    schedule 16.08.2018
comment
и - ›let image = info [.editedImage] как? UIImage - person Álvaro Agüero; 08.01.2019

В Swift 4.2 методы делегата imagePickerController немного изменились. Пожалуйста, ознакомьтесь с приведенным ниже кодом.

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

    var selectedImage: UIImage?
    if let editedImage = info[.editedImage] as? UIImage {
        selectedImage = editedImage
        self.profileImage.image = selectedImage!
        picker.dismiss(animated: true, completion: nil)
    } else if let originalImage = info[.originalImage] as? UIImage {
        selectedImage = originalImage
        self.profileImage.image = selectedImage!
        picker.dismiss(animated: true, completion: nil)
    }

}

Это точно сработает.

person Purnendu roy    schedule 01.11.2018
comment
Я бы переместил self.profileImage.image = selectedImage! picker.dismiss (animated: true, completion: nil) вне оператора if / else. - person Paragon; 26.12.2018
comment
@Paragon да, вы можете picker.dismiss (animated: true, completing: nil) вывести это из условия. Спасибо - person Purnendu roy; 30.12.2018

нравится

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

Swift4.2

 //MARK:- ImagePicker Controller Delegate
 //MARK:-

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

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

    } else{
        print("Something went wrong")
    }
}
person Maulik Patel    schedule 09.03.2019

extension CameraViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

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

Приведенный выше код устраняет предупреждение, и изображение успешно загружено.

person sara    schedule 09.04.2019
comment
Измените ответ, чтобы использовать простой текстовый блок кода вместо изображения кода. - person tshimkus; 09.04.2019