如何在不使用 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 的情况下在视图控制器之间传递图像的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在不按下按钮的情况下在视图控制器之间移动

如何在不使用 Segue 的情况下在单独的 UIViewController 中选择实例变量

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?

创建一个 segue 并通过 Swift 在两个视图控制器之间附加它?

如何在没有 Storyboards/Unwindng Segues 的情况下在 Swift 中使用 UIViewControllerAnimatedTransitioning?

如何在不重置其当前状态的情况下从一个视图控制器到自身进行转场?