如何将选定的图像从 ImagePickerController 传递到第二个视图控制器?

Posted

技术标签:

【中文标题】如何将选定的图像从 ImagePickerController 传递到第二个视图控制器?【英文标题】:How to pass a selected image from ImagePickerController to second view controller? 【发布时间】:2015-08-13 18:31:01 【问题描述】:

我已经竭尽全力寻找这个问题的答案。在我正在创建的应用程序中,用户将单击 addImage 按钮,然后从 ImagePickerController 的照片库(或相机)中选择一个图像,然后将所选图像传递到第二个视图控制器上的图像视图。

当图像视图与 addImage 按钮位于同一视图上时,我知道如何执行此操作,但不知道如何正确使用 segue 将图像传递到第二个视图。希望有人可以帮我解决这个问题。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

        var newImage = UIImage(named: "")


    @IBOutlet var imageView: UIImageView!

    var imagePicker = UIImagePickerController()

    override func viewDidLoad() 
        super.viewDidLoad()

        imagePicker.delegate = self

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    @IBAction func addImage(sender: UIButton) 

        var alert = UIAlertController(title: "Please Get An Image", message: "Choose from below", preferredStyle: .Alert)

        alert.addAction(UIAlertAction(title: "Camera", style: .Default, handler: (action) -> Void in

                        self.imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
                        self.presentViewController(self.imagePicker, animated: true, completion: nil)
        ))

        alert.addAction(UIAlertAction(title: "Photo Library", style: .Default, handler: (action) -> Void in

                        self.imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
                        self.presentViewController(self.imagePicker, animated: true, completion: nil)
        ))

        alert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: (action) -> Void in

            self.dismissViewControllerAnimated(true, completion: nil)



        ))


            self.presentViewController(alert, animated: true, completion: nil)

    

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) 

        newImage = image

     //not sure about this next line here...
     performSegueWithIdentifier("VC2", sender: self)


      self.dismissViewControllerAnimated(true, completion: nil)

    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        var secondViewController: VC2 = segue.destinationViewController as! VC2
        secondViewController.imageView.image = newImage




    


// end of app

【问题讨论】:

当您尝试设置 newImage 时,您确定 VC2 上的 UIImageView 已经实例化了吗? 我不确定。你能解释一下我会怎么做吗?我为 VC2 上的图像视图创建了一个 IBOutlet。我还需要做其他步骤吗?在 View Did Load 中,我设置了 imageView.Image = holderImage ,它假设保存在第一个 View 中选择的图像。 正如answer 建议的那样,您可以在 prepareForSegue 函数上设置断点并检查您的视图控制器是否已正确实例化 【参考方案1】:

您不应该通过使用UIImageView 对象来传递UIImage,因为这样传递图像不是一个好主意,相反,您可以在 SecondViewController 中创建 UIImage 对象,只需将 UIImage 对象传递给该对象,然后在 SecondVC 中像这样使用这个图像对象

override func viewDidLoad() 
        super.viewDidLoad()
        if imageView != nil 
            imageView.image = newImage
        
 

【讨论】:

感谢您的回答。我已经更改了代码,但我似乎在 segue 中遇到了麻烦。【参考方案2】:

好的,苏珊,所以当您在相机的预览部分单击“使用照片”时,您就可以在此处实现与第二个 VC 的连接。

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) 

    newImage = image

          dismissViewControllerAnimated(true, completion:  () -> Void in
            //Will call segue name
            self.performSegueWithIdentifier("Your_Segue_name", sender: self)
        )

编辑:在您确认要使用图像后,上述代码将继续。

在您的第二个 VC 中,持有一个持有人,然后将该持有人图像发送到您的 UIImageView。在您的第一个 VC 中,发送图像以传输给持有者图像。

你的第二个VC:

@IBOutlet var imgView: UIImageView!
var holderImage: UIImage?

在你的 viewDidLoad() 中

imgView.image = holderImage.image

【讨论】:

我已经更改了我的代码,但是在我从 imagePicker 中选择了一个照片库图像之后,它就直接回到了第一个视图控制器。它不延续到第二个。我从 addImage 按钮创建了 segue。我应该从另一个角度创建转场吗?【参考方案3】:

确保 segue 的标识符设置为“VC2”。另外,而不是设置

secondViewController.imageView.image = newImage

在您的 secondViewController 上公开一个获取图像的属性。在 prepareForSegue 中设置带有图像的属性。

secondViewController.image = newImage

然后,在 secondViewController 上的 viewDidLoad 中,将其 imageView 设置为属性中的值。

override func viewDidLoad() 
  super.viewDidLoad()
  imageView.image = image

在您的代码中,由于视图生命周期,第二个控制器上的 ImageView 尚不存在。

您还可以在 prepareForSegue 中设置断点,以确保正确调用它并正确设置第二个控制器。

【讨论】:

感谢您的回答。我已经通过代码进行了更改,但是在使用 imagePicker 选择照片库图像后,它只是直接返回到第一个视图控制器,而不是连接到第二个 vc。我有正确的 segue ID。我认为错误出在我进行转场的地方。我目前有从 addImage 按钮到第二个 vc 的 segue。这是错的吗?因为这个按钮也被用来触发警报视图来选择一张照片。 @SusanStarkman 是的,我相信你走在正确的道路上。如果按钮操作显示警报视图并且它连接到 segue,则 segue 将在显示警报视图后触发。解决此问题的一种方法是创建从第一个视图本身到第二个视图的转场,而不是按钮。您可以通过这种方式创建转场:在故事板中,在第一个视图的顶部有一个黄色圆圈 - 从那里按住 ctrl 并拖动到第二个视图,并确保为转场提供正确的标识符。然后你应该按照 whereisleo 提供的方式实现完成处理程序。 谢谢戴维。我认为这可能会解决问题。感谢您花时间向我解释。

以上是关于如何将选定的图像从 ImagePickerController 传递到第二个视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将选定的行从一个 wpf 数据网格复制到另一个 wpf 数据网格? [关闭]

Flex 4 文件参考选定的图像文件尺寸(宽度和高度)

如何根据选定的单元格在表格视图中设置启用的检查图像

将光栅图像切割到选定范围?

如何使用传入的图像 URL 将图像从 iOS 上传到 DropBox?

如何将图像从一个活动发送到从 android Gallery 中选择的另一个活动?