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
}
}
Dans prepareForSegue
, vous ne pouvez pas accéder aux @IBOutlet
s 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
}
}
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
De votre description, browsingImage
est dans la destination viewController, donc
itemToAdd.postingImage.image = browsingImage.image
Vous passez l'imageview de destination à l'imageview source
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