将图像传递给另一个视图控制器(Swift)

我试图将一个用户上传的图像从一个UIImageView移动到另一个视图控制器上的另一个UIImageView 。 我能够让用户上传一个图像,并保存在第一个UIImageView,但他们按下“后”button后,下一个视图控制器上的UIImageView保持空白。

注意:browsingImage是第二个视图控制器(目标UIImageView)上的UIImageView的名称。

任何帮助将不胜感激!

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

prepareForSegue您不能访问目标视图控制器的@IBOutlet ,因为它们尚未设置。 您应该将图像分配给目标视图控制器的属性,然后将其移至viewDidLoad

在源视图控制器中:

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

在目标视图控制器中:

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

从描述中,browseImage在目标viewController中,所以在这一行

 itemToAdd.postingImage.image = browsingImage.image 

您将目标图像视图传递给源图像视图

Segue发生的时候,你的UIImageView没有初始化,所以你不能分配一个图像,最好的做法是传递UIImage并在viewDidLoad初始化你的UIImageView

所以在你的ListPage类中使一个UIImagetypes的属性改变你的prepareForSegue行为

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

viewDidLoadviewDidAppear你的目标viewController你会做这样的事情

 browsingImage.image = image 

IBOutlet在您当前的视图控制器中不可访问。 由于您的第二个视图尚未加载,因此sockets尚未初始化。

相反,你可以在你的第二个viewController中创build一个UIImagevariables,并在prepareForSegue中赋值给它。

并在您的第二个viewController的viewDidLoad方法分配该值到您的ImageViewsockets。

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

在你的下一个viewController声明一个variables叫做

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

在viewDidLoad方法中

 postingImage.image = receivedImage