我尝试在点击按钮时将图像从一个 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:
在这种情况下,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/