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

moving the UIImageView from the main view to another

我的代码可以很好地从图库中选择图片并将其显示在同一视图中, 现在遇到的问题是,当单击 "next" 按钮时,将选择的 UIImageView 转移到下一个 activity

这是打开图库的代码

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

    }

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

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

第二个view中的imgv是这样声明的

@IBOutlet weak var imgv: UIImageView!

我哪里做错了,请指导我

您无法在第二个视图控制器中直接访问 UIImageView。而是在第二个视图控制器中创建变量 UIImage 并将您选择的 UIImage 分配给它。稍后在第二个视图控制器的 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
}

您正在为图像视图使用弱引用并试图在其他控制器中获取它。做如下 .

@IBOutlet 强变量 imgv: UIImageView

其次,您获取视图控制器的方式错误...尝试如下

if segue.identifier == "ShowCounterSegue"
{
    if let destinationVC = segue.destinationViewController as? OtherViewController{
        destinationVC.numberToDisplay = counter
     }
 }
  1. 在 PostView 中,只需创建变量 var img: UIImage!

  2. 将这一行 pass.imgv.image = imageChosen.image 替换为 pass.img = imageChosen.image

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

我们不能从firstView设置secondView的IBOutlets属性,因为ViewController的IBOutlets会在viewDidLoad()[=38=执行后获取内存]

因此您必须创建适当的数据变量以将数据传递给 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;
        }
    }
}

您不能在尚未呈现的视图中设置数据。因此,将图像传递给第二个视图,并在第二个视图的 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()
    }

}