如何将图像连接到另一个 ViewController 并在 ImageView 中显示它?

Posted

技术标签:

【中文标题】如何将图像连接到另一个 ViewController 并在 ImageView 中显示它?【英文标题】:How do I segue an image to another ViewController and display it within an ImageView? 【发布时间】:2016-01-26 17:38:27 【问题描述】:

以下代码允许用户从图库中选择图像或拍照并通过 ImageView 在 ViewController 中显示它。我在这里要做的是传递从图库中获取或选择的图像,并将其传递给另一个 ViewController,并在 ImageView 中显示它。理想情况下,一旦选择或拍摄了图片,ViewController 立即更改为第二个 ViewController 并在 ImageView 中显示图像。

如何做到这一点?谢谢。

import Foundation
import UIKit
import MobileCoreServices
import AssetsLibrary
import AVFoundation
import SystemConfiguration

class ViewController: UIViewController, UITextViewDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UIPopoverControllerDelegate, UIAlertViewDelegate 

    var controller = UIImagePickerController()
    var assetsLibrary = ALAssetsLibrary()
    var selectedImage = UIImageView ()

    private var image: UIImage? // THIS ONE

    @IBOutlet weak var btnClickMe: UIButton!
    @IBOutlet weak var imageView: UIImageView!

    var picker:UIImagePickerController?=UIImagePickerController()
    var popover:UIPopoverController?=nil

    override func viewDidLoad() 
        super.viewDidLoad()
        picker!.delegate=self

    
    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()

    

    @IBAction func btnImagePickerClicked(sender: AnyObject)
    
        let alert:UIAlertController=UIAlertController(title: "Choose Image", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

        let cameraAction = UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default)
            
                UIAlertAction in
                self.openCamera()

        
        let gallaryAction = UIAlertAction(title: "Gallery", style: UIAlertActionStyle.Default)
            
                UIAlertAction in
                self.openGallary()
        
        let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel)
            
                UIAlertAction in

        

        // Add the actions
        picker?.delegate = self
        alert.addAction(cameraAction)
        alert.addAction(gallaryAction)
        alert.addAction(cancelAction)
        // Present the controller
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        
            self.presentViewController(alert, animated: true, completion: nil)
        
        else
        
            popover=UIPopoverController(contentViewController: alert)
            popover!.presentPopoverFromRect(btnClickMe.frame, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
        
    
    func openCamera()
    
        if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
        
            picker!.sourceType = UIImagePickerControllerSourceType.Camera
            self .presentViewController(picker!, animated: true, completion: nil)
        
        else
        
            openGallary()
        
    
    func openGallary()
    
        picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        
            self.presentViewController(picker!, animated: true, completion: nil)
        
        else
        
            popover=UIPopoverController(contentViewController: picker!)
            popover!.presentPopoverFromRect(btnClickMe.frame, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
        
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
    
        picker .dismissViewControllerAnimated(true, completion: nil)
        imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
        image = imageView.image!
        performSegueWithIdentifier("TEST", sender: self)
    
    func imagePickerControllerDidCancel(picker: UIImagePickerController)
    
        print("picker cancel.")

    

这是我的第二个 ViewController

 import UIKit

class ViewController2: UIViewController 

        var Image = UIImage ()

        @IBOutlet var imageView: UIImageView!

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

        override func didReceiveMemoryWarning() 
            super.didReceiveMemoryWarning()
        
    

【问题讨论】:

【参考方案1】:

编辑 2

鉴于您的代码中有太多错误,我将更具体一点。

首先:你需要了解UIImage和UIImageView的区别

第二:如果你想在用户选择图像后执行segue,你应该调用didFinishPickingMediaWithInfo委托上的方法,像这样:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])

    picker .dismissViewControllerAnimated(true, completion: nil)
    imageView.image=info[UIImagePickerControllerOriginalImage] as? UIImage
    image = imageView.image!
    performSegueWithIdentifier("mySegueToNextViewController", sender: self)

另外,我添加了一个名为“image”的新属性(应该称为“selectedImage”,但您可以稍后更改)。

private var image: UIImage? // THIS ONE

@IBOutlet weak var btnClickMe: UIButton!
@IBOutlet weak var imageView: UIImageView!

第三:在ViewController2上需要将图片库设置为UIImageView。

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

最后:在 Storyboard 中,选择 ViewController,进入 editor -> Embed In -> Navigation Controller。

现在,应该可以正常工作了。

选择图像后,调用以下方法:

performSegueWithIdentifier("mySegueToNextViewController", sender: self)

那么你需要实现:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if segue.identifier == "mySegueToNextViewController" 
        if let nextViewController = segue.destinationViewController as? NextViewController 

            nextViewController.image = selectedImage   
        
    


请记住,要使其正常工作,您应该在 NextViewController 上拥有公共属性(就像 Unis Barakat 所说的那样)。 然后在 NextViewController viewDidLoad() 上,您可以将图像设置为 imageView。

希望这会有所帮助!

【讨论】:

我已经更新了问题和代码。我实现了您建议的代码,但仍然无法使其正常工作。当我选择图像或拍摄图像时,ViewController 不会更改为第二个,图像也不会出现在 ImageView 的第二个视图控制器中。我已经正确设置了标识符,但仍然没有运气。 您的错误是您正在创建 UIImage 的 IBOutlet 而不是 UIImageView。 @IBOutlet var image: UIImage! 应该是 @IBOutlet var imageView: UIImageView!。同样在override func viewDidLoad() 中,您需要像这样设置 UIImageView 的图像属性。 imageView.image = selectedImage. @dave 我已经做到了,但仍然没有运气,segue 没有初始化,因此它没有切换视图。我已经正确设置了所有内容并更新了上面的代码。我会给你一个下载链接。 这里是测试版的下载链接,它显示了它是如何无法正常工作的gamefront.com/files/25453575/TEST.zip 您想在用户选择图像后立即移动到下一个视图控制器?【参考方案2】:

在类的顶部定义一个变量,例如:

var selectedImage: UIImage

然后,当您在该视图控制器中设置该图像并在另一个视图控制器中时,您只需显示您在第一个控制器中设置的图像。

【讨论】:

全局变量是糟糕的设计选择,如果要使用全局变量,至少应该使用单例。

以上是关于如何将图像连接到另一个 ViewController 并在 ImageView 中显示它?的主要内容,如果未能解决你的问题,请参考以下文章

IOS如何将一个数组连接到另一个视图控制器

使用 codeigniter 将连接表中的列连接到另一列

如何将一个表中的最新行连接到另一个表?

如何将使用 docker 创建的 MySQL 连接到另一个端口(不是端口 3306)?

如何将表 id 字段连接到另一个表 id 字段? [关闭]

当日期在其他两个日期之间时,如何将数据集连接到另一个 R