将图像从 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