web-dev-qa-db-fra.com

Passage d'image à un autre contrôleur de vue (Swift)

J'essaie de déplacer une image téléchargée par un utilisateur d'un UIImageView vers un autre UIImageView sur un autre contrôleur de vue. Je peux demander à l'utilisateur de télécharger une image et de l'enregistrer dans le premier UIImageView mais après avoir appuyé sur le bouton "Publier", UIImageView du contrôleur de vue suivant reste vide.

Remarque: browsingImage est le nom de UIImageView sur le second contrôleur de vue (destination UIImageView).

Toute aide serait grandement appréciée!

@IBAction func cameraButton(sender: AnyObject) {

    addNewPicture()

}


func addNewPicture() {

    let picker = UIImagePickerController()
    picker.allowsEditing = true
    picker.delegate = self

    presentViewController(picker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

    postingImage.image = image
    self.dismissViewControllerAnimated(true, completion: nil)

}

@IBAction func postButton(sender: AnyObject) {

    performSegueWithIdentifier("toBrowsePage", sender: nil)


}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {


        var itemToAdd = segue.destinationViewController as! ListPage

        itemToAdd.postingImage.image = browsingImage.image

    }

}
12
user5034511

Dans prepareForSegue, vous ne pouvez pas accéder aux @IBOutlets du contrôleur de vue de destination car ils n'ont pas encore été configurés. Vous devez affecter l'image à une propriété du contrôleur de vue de destination, puis la déplacer en place dans viewDidLoad:

Dans le contrôleur de vue source:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {
        let dvc = segue.destinationViewController as! ListPage
        dvc.newImage = postingImage.image
    }
}

Dans le contrôleur de vue de destination:

class ListPage: UIViewController {
    @IBOutlet weak var browsingImage: UIImageView!
    var newImage: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        browsingImage.image = newImage
    }
}
21
vacawama

Les IBOutlets ne sont pas accessibles dans votre contrôleur de vue actuel. Les prises ne sont pas encore initialisées car le votre deuxième vue n’est pas encore chargée

À la place, vous pouvez créer une variable UIImage dans votre second viewController et lui attribuer la valeur dans le prepareForSegue.

Et dans la seconde méthode viewDontLoad de votre viewController, affectez cette valeur à votre sortie ImageView.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {
        let destination = segue.destinationViewController as! ListPage
        destination.receivedImage = postingImage.image
    }
}

Dans votre prochain viewController, déclarez une variable appelée 

@IBOutlet weak var postingImage: UIImageView!
var receivedImage : UIImage?

Dans la méthode viewDidLoad 

postingImage.image = receivedImage
1
iPhoneDeveloper

De votre description, browsingImage est dans la destination viewController, donc

itemToAdd.postingImage.image = browsingImage.image

Vous passez l'imageview de destination à l'imageview source

1
Leo

Au moment de la Segue, votre UIImageView n’est pas initialisé; vous ne pouvez donc pas lui attribuer d’image. La meilleure pratique consiste donc à passer la UIImage et à initialiser votre UIImageView dans viewDidLoad.

ainsi, dans votre classe ListPage, définissez une propriété de type UIImage et modifiez votre ligne prepareForSegue de la manière suivante: 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {


        var itemToAdd = segue.destinationViewController as! ListPage

        itemToAdd.image = browsingImage.image

        }

    }

dans viewDidLoad ou viewDidAppear de votre destination viewController vous ferez quelque chose comme ceci

browsingImage.image = image
0
Qazi