1
votes

I try to pass an image from one ViewController1 to another ViewController2 when a button is tapped. I am using segues in my Storyboard.

ViewController1

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    var imagePicker: UIImagePickerController!

    @IBAction func editPhoto(_ sender: UIButton) {
        let editViewController = storyboard?.instantiateViewController(withIdentifier: "EditImageViewController") as! EditImageViewController
        editViewController.imageForEdit = imageView.image!
        print(imageView)
        print(imageView.image!)
        navigationController?.pushViewController(editViewController, animated: true)
    }

    @IBOutlet weak var imageView: UIImageView! {
        didSet {
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
        }
    }

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

print(imageView) results in

some(UIImageView: 0x7fc34df0e630; frame = (8 29; 303 443); clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = CALayer: 0x60000023e520)

and print(imageView.image!) in

size {3000, 2002} orientation 0 scale 1.000000

ViewController2

import UIKit

class EditImageViewController: UIViewController {

    var imageForEdit = UIImage()

    @IBOutlet weak var editingImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        editingImage.image = imageForEdit
        print(imageForEdit)
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

print(imageForEdit) results in

size {0, 0} orientation 0 scale 1.000000

Why is that? Why isnt the image passed to ViewController2?

4
Try move local variable let editViewController from function to your ViewController class.AleX
@AleX That is not working. Cannot use instance member 'storyboard' within property initializer; property initializers run before 'self' is availableStophface
Write var editViewController: EditImageViewController?, then in your function -> editViewController = storyboard?.instantiateViewController(withIdentifier: "EditImageViewController") as! EditImageViewControllerAleX
@AleX No, I am still getting nothing.Stophface

4 Answers

1
votes

It seems to me that this could be a lot simpler. If you're using a Storyboard with a segue, you can easily accomplish this in prepare(for segue: UIStoryboardSegue, sender: Any?). Here's a sample storyboard:

storyboard

In this case, ViewController has a segue on the Edit Image button to the EditImageViewController.

When you push that button, you get your prepare(for segue: call. Here's a sample ViewController:

class ViewController: UIViewController {

    var imagePath = Bundle.main.path(forResource: "icon8", ofType: "png")
    var anEditableImage:UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()
        if let imagePath = imagePath {
            anEditableImage = UIImage(contentsOfFile: imagePath)
        }
    }

     // MARK: - Navigation
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? EditImageViewController {
            destination.imageForEdit = anEditableImage
        }
     }
}

And here's the EditImageViewController:

class EditImageViewController: UIViewController {

    var imageForEdit:UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()

        print(imageForEdit ?? "Image was nil")
    }
}

Using prepare(for segue: UIStoryboardSegue, sender: Any?) is the preferred way for a Storyboard-based app to pass data between View Controllers. It's very simple and it works.

Sample project is here if you want to see the working code:

https://www.dropbox.com/s/eog01bmha67c5mv/PushImage.zip?dl=0

0
votes
var imageForEdit: UIImage? {
    didSet {
        editingImage.image = imageForEdit
    }
}
0
votes

Replace var imageForEdit = UIImage() with var imageForEdit : UIImage?

i test code my self , make sure that imageView have image

 @IBOutlet weak var imageView: UIImageView! {
        didSet {
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
        }
    }
0
votes

You can create an public variable so you can pase data from one viewcontroller to another view controller.

class variables
{
    static var image = UIImage()
}

the 2 controller:

@IBOutlet weak var anotherviewcontroller: UIImageView!

anotherviewcontroller.image = variables.image