Andrew Tuzson
Andrew Tuzson

Reputation: 639

Displaying selected image on screen using UIIamgePickerControllerDelegate in Swift

I am attempting to learn more about the delegate pattern. I have written an app that accesses the user's camera roll and I want to display that image on the view controller after the user selects the image. Here is what I have thus far:

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imagePickerView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    // Delegate Methods
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
            imagePickerView.image = image
        }
    }

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

    @IBAction func pickAnImage(_ sender: Any) {

        let pickerController = UIImagePickerController()
        present(pickerController, animated: true, completion: nil)
    }
}

The camera roll appears as expected and the Cancel buttons dismiss the modal. Selecting an image also dismisses the modal, however that image is not displayed on the screen. I have confirmed that my imagePickerController is corrected referenced as an outlet. What am I missing?

Upvotes: 2

Views: 2523

Answers (3)

Frankenstein
Frankenstein

Reputation: 16341

You have to dismiss the controller once the image is selected, maybe the following detailed function will help you.

For Swift 4.2:

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

    var selectedImageFromPicker: UIImage?
    if let editedImage = info[.editedImage] as? UIImage {
        selectedImageFromPicker = editedImage
    } else if let originalImage = info[.originalImage] as? UIImage {
        selectedImageFromPicker = originalImage
    }

    if let selectedImage = selectedImageFromPicker {
        imageView.image = selectedImage
    }
    dismiss(animated: true, completion: nil)
}

Before Swift 4.2:

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

    var selectedImageFromPicker: UIImage?
    if let editedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
        selectedImageFromPicker = editedImage
    } else if let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        selectedImageFromPicker = originalImage
    }

    if let selectedImage = selectedImageFromPicker {
        imageView.image = selectedImage
    }
    dismiss(animated: true, completion: nil)
}

Since I've received many points from this answer I'm adding a more concise answer (Just one line is required for setting the image to imageView).

Bonus Answer:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    imageView.image = (info[.editedImage] ?? info[.originalImage]) as? UIImage
    dismiss(animated: true)
}

Upvotes: 7

Ashish Bahl
Ashish Bahl

Reputation: 1493

  • Ensure you have made all inclusions in the info.plist file
  • Ensure you have all the delegates set
  • Ensure what you are using to display image (e.g if editing is set to true, then UIImagePickerControllerEditedImage else UIImagePickerControllerOriginalImage)

Upvotes: 0

akhiljayaram
akhiljayaram

Reputation: 141

You need to set the view controller as the delegate of pickerController

// pickerController.delegate = self

Also check the imagePickerView outlet is connected.

Upvotes: 1

Related Questions