将图像传递给另一个视图控制器(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
类中使一个UIImage
types的属性改变你的prepareForSegue
行为
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "toBrowsePage" { var itemToAdd = segue.destinationViewController as! ListPage itemToAdd.image = browsingImage.image } }
在viewDidLoad
或viewDidAppear
你的目标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