ios - 将图像从 ViewController 传递到 ViewController

标签 ios iphone swift xcode

我尝试在点击按钮时将图像从一个 ViewController1 传递到另一个 ViewController2。我在 Storyboard中使用 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!)

size {3000, 2002} orientation 0 scale 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) 结果为

size {0, 0} orientation 0 scale 1.000000

这是为什么呢?为什么不将图像传递给 ViewController2

最佳答案

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

storyboard

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

当您按下该按钮时,您将获得 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的应用程序在 View Controller 之间传递数据的首选方式。它非常简单而且有效。

如果您想查看工作代码,请在此处查看示例项目:

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

关于ios - 将图像从 ViewController 传递到 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490356/

相关文章:

ios - 获取不到的崩溃

ios - 快速选择音频设备输出(如 Waze)

ios - 是否允许指向 Objective-C 数组的指针(通过桥接 header )?

ios - 自定义相机 View - 无法更改cameraLayout UIImagePicker、Swift的帧大小

ios - 检查应用名称是否可用

iphone - C++中::的含义

iphone - iOS - 没有互联网连接时连接失败警报消息

ios - 如何获取 TableView 数据到 detailsViewController

objective-c - iOS 应用程序在真实设备上速度变慢

ios - 选择了错误的 iOS 配置文件