14

Trying to pass chat client from swift 4 to swift 4.2 and with picker i found trouble.

UIImagePickerControllerEditedImage Cannot subscript a value of type '[String : Any]' with an index of type '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)
}
Ashish
  • 706
  • 8
  • 22
George Heints
  • 1,303
  • 3
  • 20
  • 37

6 Answers6

22

The method signature has changed to

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

You should see a warning message for the func name

Instance method 'imagePickerController(:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

Candidate has non-matching type '(UIImagePickerController, [String : Any]) -> ()'

Move 'imagePickerController(_:didFinishPickingMediaWithInfo:)' to another extension to silence this warning

Make 'imagePickerController(_:didFinishPickingMediaWithInfo:)' private to silence this warning

Requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' declared here (UIKit.UIImagePickerControllerDelegate)

Ashley Mills
  • 50,474
  • 16
  • 129
  • 160
10

In Swift 4.2 imagePickerController delegate methods has changed a bit. Kindly check out the below code.

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

}

This will work for sure.

Purnendu roy
  • 818
  • 8
  • 15
  • 1
    I would move self.profileImage.image = selectedImage! picker.dismiss(animated: true, completion: nil) outside of 'if/else' statement. – Paragon Dec 26 '18 at 18:19
  • @Paragon yes you can "picker.dismiss(animated: true, completion: nil)" put this out of the condition. Thanks – Purnendu roy Dec 30 '18 at 07:55
7

like this

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
    picker.dismiss(animated: true, completion: nil)
    let image = info[UIImagePickerController.InfoKey.originalImage]! as! UIImage
    ...
}
Rob
  • 415,655
  • 72
  • 787
  • 1,044
yaoning
  • 121
  • 4
3

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")
    }
}
Maulik Patel
  • 2,045
  • 17
  • 24
2
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        if let pickedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
            yourImage.image = pickedImage
        }else{
            print("Something went wrong!!")
        }
    }
Saurabh
  • 745
  • 1
  • 9
  • 33
SCS
  • 435
  • 3
  • 12
0
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)
    }
}

Above code solved the warning and image successfully uploaded

Saurabh
  • 745
  • 1
  • 9
  • 33
sara
  • 39
  • 5