将UIImageView从主视图移动到另一个

我的代码工作正常,从图库中select图片,并显示在同一视图中,现在陷入了什么,正在将选中的UIImageView转移到下一个活动,当“下一步”button被点击

这里是打开画廊的代码

@IBAction func gallery(sender: AnyObject) { if UIImagePickerController.availableMediaTypesForSourceType(.PhotoLibrary) != nil { picker.allowsEditing = false picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary presentViewController(picker, animated: true, completion: nil) } } 

这是在同一视图中显示图像的代码

 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { var chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage imageChosen.contentMode = .ScaleAspectFit imageChosen.image = chosenImage dismissViewControllerAnimated(true, completion: nil) } 

现在在保存在imageChosen中的UIImageView之后,下面是用于将该图像传递到下一个视图的代码

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var pass:postView = segue.destinationViewController as! postView if(segue.identifier == "next"){ pass.imgv.image = imageChosen.image } } 

这一行代码导致程序崩溃

 pass.imgv.image = imageChosen.image 

第二个视图中的imgv是这样声明的

 @IBOutlet weak var imgv: UIImageView! 

我在这里做错了什么,请指导我

您无法在尚未呈现的视图中设置数据。 因此,传递图像到第二个视图,并将图像设置为在secondView的viewDidLoad ImageView

  override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) { if segue.identifier == "next" { var pass:second = segue.destinationViewController as! second pass.currentImage=myImageView.image; } } 

//第二个视图

 class second: UIViewController { @IBOutlet weak var tempImgView: UIImageView! var currentImage:UIImage! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. if((currentImage) != nil){ tempImgView.image=currentImage; } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

您正在使用图像视图的弱引用,并试图将其在其他控制器中。 做如下。

@IBOutlet强有力的imgv:UIImageView

其次,你的方式来获取视图控制器错误…尝试如下

 if segue.identifier == "ShowCounterSegue" { if let destinationVC = segue.destinationViewController as? OtherViewController{ destinationVC.numberToDisplay = counter } } 

您不能直接在第二个View Controller中访问UIImageView 。 而是在第二个视图控制器中创build可变的UIImage ,并将所选的UIImage分配给它。 稍后在第二个View Controller的viewdidload中设置UIImageView

第一视图

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { let pass:postView = segue.destinationViewController as! postView if(segue.identifier == "next"){ pass.tempImage = imageChosen.image } } 

第二视图

 @IBOutlet weak var imgv: UIImageView! var tempImage:UIImage! override func viewDidLoad() { super.viewDidLoad() self.imgv.image=tempImage } 
  1. 在PostView中,只需创build像var img: UIImage!这样的variablesvar img: UIImage!

  2. pass.imgv.image = imageChosen.imagereplace这一行pass.imgv.image = imageChosen.image pass.img = imageChosen.image

  3. 在PostView的viewDidLoad()中,添加这一行imgv.image = image

我们不能从firstView中设置secondView的IBOutlets的属性,因为ViewController的IBOutlets 会在执行viewDidLoad()之后得到内存。

所以你必须创build适当的数据variables来将数据传递给IBOutlet。

这是示例代码。

 class FirstViewController: UIViewController { @IBOutlet weak var imageViewInput: UIImageView! override func viewDidLoad() { super.viewDidLoad() } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { //check the condition for your segue.identifier, if any var destination : NewViewContrller! = segue.destinationViewController as NewViewContrller ; if let image = imageViewInput?.image { destination.outputImage = image; } } } class NewViewContrller: UIViewController { @IBOutlet weak var outputImageView: UIImageView! var outputImage: UIImage! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. if let image = outputImage { outputImageView.image = image; } } }