如何在不使用 segue 的情况下在视图控制器之间传递图像
Posted
技术标签:
【中文标题】如何在不使用 segue 的情况下在视图控制器之间传递图像【英文标题】:How to pass an image between view controllers without using segue 【发布时间】:2016-12-28 13:14:04 【问题描述】:我收到一个错误:
线程 1:EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0x0)
在尝试将从照片库中选择的图像传递给另一个视图控制器时。
源视图控制器 -
@IBAction func myButtonTapped(_ sender: UIButton)
let secondVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as! secondVC
secondVC.passedVName = VNameTextField.text!
secondVC.passedCcName = DropTextBox.text!
secondVC.passedVImage = VImageView.image!
navigationController?.pushViewController(secondVC, animated: true)
目标视图控制器 -
class secondVC: UIViewController
@IBOutlet weak var DisplayPassedImage: UIImageView!
@IBOutlet weak var ccNameDisplayLabel: UILabel!
@IBOutlet weak var VNameDisplayLabel: UILabel!
var passedVName = ""
var passedCcName = ""
var passedVImage = UIImage()
override func viewDidLoad()
super.viewDidLoad()
VNameDisplayLabel.text = passedVName
ccNameDisplayLabel.text = passedCcName
DisplayPassedImage.image = passedVImage // Error- Thread 1:EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0x0)
注意:“PassedVName”和“passedCcName”数据已成功传递到目标 ViewController。如果我尝试传递“passedVImage”,我会收到错误消息。
【问题讨论】:
不是一个答案,只是一个建议:不要在属性和变量名称中以大写字母开头。 VImageView.image 读起来像 image 是 VImageView 类的类属性。它使阅读代码变得更加困难,坚持给定语言的通用风格 为什么要传递 Image ?如果您有图像,则将图像名称传递给 anotherViewController 或者如果您没有图像(如果您有图像 URL),则将图像路径传递给 anotherViewController 仔细检查以确保您的@IBOutlet
for DisplayPassedImage
已连接到您的 Storyboard。
这是完整的错误吗?我怀疑它也说类似fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)
由于UIImageView
上的image
属性是可选的,您可以将passedVImage
设为可选,例如var passedVImage: UIImage?
,这将使您的代码更安全,并减少必须执行@987654330 的需要@ 在源视图控制器中传递值时。这可以帮助解决这种情况,您可以更轻松地观察传递的图像是否为nil
。不幸的是,您仍然不能在情节提要中使用初始化程序注入。多次迫使您陷入不安全的境地
【参考方案1】:
您可以使用NotificationCenter
将操作/消息传递给任何视图控制器。在这里,您需要在 AppDelegate
(意味着全局)中获取 UIImage
对象,以便您可以在任何地方传递它。
例如
1) 你在 firstVC
2) 在 firstVC 中选择 Image 并将此图像添加到您在 AppDelegate
中拍摄的图像对象中
3) 在 firstVC 中发布您想要传递操作的通知
4) 在您的 SecondVC 上添加观察
5)您可以从AppDelegate
对象(全局对象)获取图像。
否则你可以使用协议。
【讨论】:
【参考方案2】:根据我对您的有限经验,应该将.jpg
更改为.png
图像
【讨论】:
以上是关于如何在不使用 segue 的情况下在视图控制器之间传递图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Segue 的情况下在单独的 UIViewController 中选择实例变量
如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?
创建一个 segue 并通过 Swift 在两个视图控制器之间附加它?
如何在没有 Storyboards/Unwindng Segues 的情况下在 Swift 中使用 UIViewControllerAnimatedTransitioning?