swift my UIImagePicker doesn't show any image on select image from photo library

Viewed 555

everyone I take an imageView and set an image on it, I want to select an image from the photo library if the user tapped on the image here my code is

    @IBOutlet weak var uploadImage: UIImageView!
    var imagePicker = UIImagePickerController()
override func viewDidLoad() {
        super.viewDidLoad()
        
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
        uploadImage.isUserInteractionEnabled = true
        uploadImage.addGestureRecognizer(tapGestureRecognizer)
    }
    @objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
    {
        print("image tapped")
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary){
            print("Button capture")
            let imag = UIImagePickerController()
            imag.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate
            imag.sourceType = UIImagePickerControllerSourceType.photoLibrary;
            imag.allowsEditing = false
            self.present(imag, animated: true, completion: nil)
        }
    }
    
    func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {
        let selectedImage : UIImage = image
        uploadImage.image=selectedImage
        self.dismiss(animated: true, completion: nil)
    }

but it doesn't show image after select an image from the photo library,
it shows me the message in debug area -

[1098:24494] [discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}

3 Answers

You are implementing the wrong didFinishPickingMediaWithInfo method signature.

The correct signature should be

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

Try like this:

Conform your controller to UIImagePickerControllerDelegate and UINavigationControllerDelegate and declare your imaView programmatically like this:

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

let imageV: UIImageView = {
    let iv = UIImageView()
    iv.image = UIImage(named: "yourImageName")
    iv.isUserInteractionEnabled = true
    iv.clipsToBounds = true
    iv.contentMode = .scaleAspectFit
    iv.translatesAutoresizingMaskIntoConstraints = false
    
    return iv
}()

Now in viewDidLoad set imageView tap gesture and constraints:

override func viewDidLoad() {
    super.viewDidLoad()
    
    view.backgroundColor = .black
    
    let gesture = UITapGestureRecognizer(target: self, action: #selector(handlePickImage))
    imageV.addGestureRecognizer(gesture)
    
    view.addSubview(imageV)
    imageV.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    imageV.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    imageV.heightAnchor.constraint(equalToConstant: 200).isActive = true
    imageV.widthAnchor.constraint(equalToConstant: 200).isActive = true
}

Declare, set and present your pickerController in handlePickImage function:

var imagePicker = UIImagePickerController()

@objc fileprivate func handlePickImage() {
    
    imagePicker.delegate = self
    imagePicker.sourceType = .photoLibrary
    imagePicker.view.tintColor = .white
    imagePicker.modalPresentationStyle = .fullScreen
    imagePicker.mediaTypes = ["public.image"]
    imagePicker.allowsEditing = false
    imagePicker.navigationBar.barTintColor = .darkGray
    print("tapped....")
    
    if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
        present(imagePicker, animated: true, completion: nil)
    }
}

Now you can handle your image picked:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
    if let imagePicked = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
        imageV.image = imagePicked
        print("Image picked height:", imagePicked.size.height, "Image picked width:", imagePicked.size.width)
    }
    
    picker.dismiss(animated: true) {
        print("Picker Dismissed...")
    }
}

Don't forget to set if user tap on cancel button

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

I faced the same problem. It was solve! The problem was that I forgot add the delegate.

imagePicker.delegate = self

Be aware that:

[1098:24494] [discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled}

Is just a warning. This message doesnt mean a problem

Related