Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 476
Andrew Tuzson Avatar asked Dec 07 '25 09:12

Andrew Tuzson


1 Answers

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)
}
like image 119
Frankenstein Avatar answered Dec 08 '25 23:12

Frankenstein