J'essaye de passer une image d'un ViewController1 à un autre ViewController2 lorsqu'un bouton est appuyé. J'utilise segues dans mon 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) entraîne

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

Et print(imageView.image!) dans

taille {3000, 2002} orientation 0 échelle 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) entraîne

taille {0, 0} orientation 0 échelle 1,000000

Pourquoi donc? Pourquoi l'image n'est-elle pas transmise à ViewController2?

1
Stophface 23 mai 2018 à 17:00

4 réponses

Meilleure réponse

Il me semble que cela pourrait être beaucoup plus simple. Si vous utilisez un Storyboard avec une séquence, vous pouvez facilement le faire dans prepare(for segue: UIStoryboardSegue, sender: Any?). Voici un exemple de storyboard:

storyboard

Dans ce cas, ViewController a une transition sur le bouton Edit Image vers le EditImageViewController.

Lorsque vous appuyez sur ce bouton, vous recevez votre appel prepare(for segue:. Voici un exemple de 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
        }
     }
}

Et voici le EditImageViewController:

class EditImageViewController: UIViewController {

    var imageForEdit:UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()

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

L'utilisation de prepare(for segue: UIStoryboardSegue, sender: Any?) est le moyen privilégié pour une application basée sur un storyboard pour transmettre des données entre les contrôleurs de vue. C'est très simple et ça marche.

Un exemple de projet est ici si vous souhaitez voir le code de travail:

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

1
David S. 23 mai 2018 à 15:40
var imageForEdit: UIImage? {
    didSet {
        editingImage.image = imageForEdit
    }
}
0
Alexey Kudlay 23 mai 2018 à 14:16

Remplacez var imageForEdit = UIImage() par var imageForEdit : UIImage?

Je teste le code moi-même, je m'assure que imageView a une image

 @IBOutlet weak var imageView: UIImageView! {
        didSet {
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
        }
    }
0
Abdelahad Darwish 23 mai 2018 à 14:24

Vous pouvez créer une variable publique afin de pouvoir transmettre des données d'un contrôleur de vue à un autre contrôleur de vue.

class variables
{
    static var image = UIImage()
}

Le 2 contrôleur:

@IBOutlet weak var anotherviewcontroller: UIImageView!

anotherviewcontroller.image = variables.image
0
Frederik L. Frandsen 27 mai 2018 à 15:49