将图像从 ViewController 传递到 ViewController

Posted

技术标签:

【中文标题】将图像从 ViewController 传递到 ViewController【英文标题】:Passing image from ViewController to ViewController 【发布时间】:2018-05-23 14:00:27 【问题描述】:

当点击按钮时,我尝试将图像从一个 ViewController1 传递到另一个 ViewController2。我在故事板中使用segues

ViewController1

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate 

    var imagePicker: UIImagePickerController!

    @IBAction func editPhoto(_ sender: UIButton) 
        let editViewController = storyboard?.instantiateViewController(withIdentifier: "EditImageViewController") as! EditImageViewController
        editViewController.imageForEdit = imageView.image!
        print(imageView)
        print(imageView.image!)
        navigationController?.pushViewController(editViewController, animated: true)
    

    @IBOutlet weak var imageView: UIImageView! 
        didSet 
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

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

print(imageView) 结果

some(UIImageView: 0x7fc34df0e630; frame = (8 29; 303 443); clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = CALayer: 0x60000023e520)

print(imageView.image!)

大小 3000, 2002 方向 0 比例 1.000000

ViewController2

import UIKit

class EditImageViewController: UIViewController 

    var imageForEdit = UIImage()

    @IBOutlet weak var editingImage: UIImageView!

    override func viewDidLoad() 
        super.viewDidLoad()
        editingImage.image = imageForEdit
        print(imageForEdit)
        // Do any additional setup after loading the view.
    

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

print(imageForEdit) 结果

大小 0, 0 方向 0 缩放 1.000000

这是为什么呢?为什么图片没有传给ViewController2

【问题讨论】:

尝试将局部变量 let editViewController 从函数移动到您的 ViewController 类。 @AleX 这不起作用。 Cannot use instance member 'storyboard' within property initializer; property initializers run before 'self' is available var editViewController: EditImageViewController?,然后在你的函数中-> editViewController = storyboard?.instantiateViewController(withIdentifier: "EditImageViewController") as! EditImageViewController @AleX 不,我仍然一无所获。 【参考方案1】:

在我看来,这可能要简单得多。如果您使用带有 segue 的 Storyboard,您可以在 prepare(for segue: UIStoryboardSegue, sender: Any?) 中轻松完成此操作。这是一个示例故事板:

在这种情况下,ViewController 在Edit Image 按钮上与EditImageViewController 有一个segue。

当您按下该按钮时,您会收到prepare(for segue: 电话。这是一个示例 ViewController:

class ViewController: UIViewController 

    var imagePath = Bundle.main.path(forResource: "icon8", ofType: "png")
    var anEditableImage:UIImage?

    override func viewDidLoad() 
        super.viewDidLoad()
        if let imagePath = imagePath 
            anEditableImage = UIImage(contentsOfFile: imagePath)
        
    

     // MARK: - Navigation
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if let destination = segue.destination as? EditImageViewController 
            destination.imageForEdit = anEditableImage
        
     

这是EditImageViewController

class EditImageViewController: UIViewController 

    var imageForEdit:UIImage?

    override func viewDidLoad() 
        super.viewDidLoad()

        print(imageForEdit ?? "Image was nil")
    

使用prepare(for segue: UIStoryboardSegue, sender: Any?) 是基于 Storyboard 的应用程序在视图控制器之间传递数据的首选方式。这很简单,而且很有效。

如果您想查看工作代码,这里有示例项目:

https://www.dropbox.com/s/eog01bmha67c5mv/PushImage.zip?dl=0

【讨论】:

【参考方案2】:
var imageForEdit: UIImage? 
    didSet 
        editingImage.image = imageForEdit
    

【讨论】:

这给了我:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value 在哪个地方? 在这里:var imageForEdit: UIImage? didSet editingImage.image = imageForEdit ,更准确地说是在这里editingImage.image = imageForEdit navigationController?.pushViewController(editViewController, animated: true)之后设置editViewController.imageForEdit = imageView.image!【参考方案3】:

var imageForEdit = UIImage() 替换为var imageForEdit : UIImage?

我自己测试代码,确保imageView有图像

 @IBOutlet weak var imageView: UIImageView! 
        didSet 
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
        
    

【讨论】:

ViewController2 中的 print(imageForEdit) 会导致 nil 我确定您还有其他问题,但上面的代码可以正常工作 imageView 有图片。我从图库中选择它并显示它。您还可以在打印语句中看到它具有图像。它只是没有传递给另一个ViewController2 尝试直接传图片没有UIImageView代码没有错误 什么意思?【参考方案4】:

您可以创建一个公共变量,以便将数据从一个视图控制器传递到另一个视图控制器。

class variables

    static var image = UIImage()

第二个控制器:

@IBOutlet weak var anotherviewcontroller: UIImageView!

anotherviewcontroller.image = variables.image

【讨论】:

以上是关于将图像从 ViewController 传递到 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

通过 iCarousel 将信息传递给多个 viewController

UIImage 没有从一个 ViewController 传递到另一个

将所选图像从 uiscrollView 传递到其他 viewController

将图像从 tableViewcell(Xib 文件)传递给另一个 ViewController

(iOS + Firebase)无法将图像从 UITableViewCell 传递给下一个 ViewController

如何将参数从容器视图的父 ViewController 传递到该容器视图的 PageViewController?