0

i am trying to pass an image from 1st UIViewController to 2nd UIViewControlleler by prepareforSegue

my code :-

extension ViewController:UIImagePickerControllerDelegate,UINavigationControllerDelegate {
func handleImg() {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    var selectedImageFromPicer : UIImage?
    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
        selectedImageFromPicer = editedImage
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {

        selectedImageFromPicer = originalImage
    }

    if let selectedImage = selectedImageFromPicer {
        imgg.image = selectedImage  
    }
    guard let imageUrl = info["UIImagePickerControllerImageURL"] as? URL else {
        return
    }
    self.performSegue(withIdentifier: "selected", sender: self)
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        print("canceled picker")
        dismiss(animated: true, completion: nil)
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "selected" {
        let vc = segue.destination as! secondVC
        vc.img.image = self.imgg.image

    }
}

i am getting the error on line vc.img.image = self.imgg.image

Error

fatal error: unexpectedly found nil while unwrapping an Optional value

Yash R
  • 247
  • 2
  • 19

2 Answers2

0

You are getting that error because of self.imgg.image is nil. So you are only setting imgg when it is not empty like this:

if let selectedImage = selectedImageFromPicer {
    imgg.image = selectedImage  
}

but what if this code is never run, then it will throw an error that unexpectedly found nil.

So when you are setting it for second VC, first check if it is not null and then set it like this:

vc.img.image = self.imgg.image
Abhishek Jain
  • 826
  • 8
  • 20
0

Create variable in secondVC of type UIImage and from your first viewcontroller set image in that variable

You are getting this exception because views of secondVC is not yet created in memory.

So in FirstVC apply following changes

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "selected" {
        let vc = segue.destination as! secondVC
        vc.image = self.imgg.image

    }
}

In secondVC apply following changes

Declare var image: UIImage? = nil

And in viewDidLoad() set image to imageView

override func viewDidLoad() {
    super.viewDidLoad()
    self.img.image = image
}
Priya
  • 735
  • 5
  • 10