Pasar imagen a otro controlador de vista (Swift)

Estoy tratando de mover una imagen cargada por un usuario de un UIImageView a otro UIImageView en un controlador de vista diferente. Puedo hacer que el usuario cargue una imagen y que se guarde en el primer UIImageView, pero después de presionar el botón “Publicar”, el UIImageView en el siguiente controlador de vista permanece en blanco.

Nota: browseImage es el nombre de UIImageView en el segundo controlador de vista (destino UIImageView)

¡Cualquier ayuda sería muy apreciada!

@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 } } 

En prepareForSegue no puede acceder a las @IBOutlet s del controlador de vista de destino porque aún no se han configurado. Debería asignar la imagen a una propiedad del controlador de vista de destino y luego moverla a su lugar en viewDidLoad :

En el controlador de vista de fuente:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "toBrowsePage" { let dvc = segue.destinationViewController as! ListPage dvc.newImage = postingImage.image } } 

En el controlador de vista de destino:

 class ListPage: UIViewController { @IBOutlet weak var browsingImage: UIImageView! var newImage: UIImage! override func viewDidLoad() { super.viewDidLoad() browsingImage.image = newImage } } 

Según su descripción, browsingImage está en viewController de destino, entonces en esta línea

 itemToAdd.postingImage.image = browsingImage.image 

Pasa la vista de imagen de destino a la imagen de origen

IBOutlets no son accesibles en su controlador de vista actual. Los puntos de venta aún no se han inicializado debido a que aún no se ha cargado su segunda vista .

En su lugar, puede crear una variable UIImage en su segundo viewController y asignarle el valor en prepareForSegue.

Y en su segundo método viewDidLoad de viewController asigne ese valor a su salida de ImageView.

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "toBrowsePage" { let destination = segue.destinationViewController as! ListPage destination.receivedImage = postingImage.image } } 

En su siguiente viewController declara una variable llamada

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

En el método viewDidLoad

 postingImage.image = receivedImage 

En el momento de la Segue sucediendo su UIImageView no se inicializa por lo que no puede asignarle una imagen, la mejor práctica sería pasar el UIImage e inicializar su UIImageView en viewDidLoad .

entonces en su clase ListPage , haga una propiedad de tipo UIImage cambie su línea prepareForSegue como

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "toBrowsePage" { var itemToAdd = segue.destinationViewController as! ListPage itemToAdd.image = browsingImage.image } } 

en viewDidLoad o viewDidAppear de su viewDidAppear de destino hará algo como esto

 browsingImage.image = image