如何在视图控制器之间传递图片而不使用segue

4

我遇到了一个错误

Thread 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)

    }

目标 ViewController -

 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 读起来像是 VImageView 类的 image 属性。这会使代码阅读更加困难,应该坚持给定语言的常见风格。 - Lope
为什么要传递图像?如果您有图像,则将图像名称传递给另一个视图控制器。或者,如果您没有图像(如果您有图像URL),则将图像路径传递给另一个视图控制器。 - Vivek Gajbe
这是完整的错误吗?我怀疑它还会说类似于“fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)”这样的内容。 - shallowThought
由于UIImageView上的image属性是可选的,因此您可以使passedVImage变量也是可选的,例如var passedVImage: UIImage?,这将使您的代码更安全,并减轻在源视图控制器中传递值时需要执行VImageView.image!的需求。这可以帮助解决问题,您可以更轻松地观察传递的图像是否为nil。不幸的是,您仍然无法在storyboard中使用初始化程序注入,这往往会使您陷入不安全的境地。 - cjrieck
根据我的理解:当你给 VImageView.image! 分配一个图像时,请尝试复制该图像,然后再分配给它。 - Dheeraj D
显示剩余5条评论
2个回答

1
你可以使用NotificationCenter将操作/消息传递给任何viewController。在这里,您需要在AppDelegate中获取UIImage对象(全局),以便您可以在任何地方传递它。
例如: 1)您在firstVC中 2)在firstVC中选择图像并将此图像添加到您在AppDelegate中获取的图像对象中 3)在firstVC中发布您要传递操作的通知 4)在SecondVC上添加观察者 5)您可以从AppDelegate对象(全局对象)获取图像。
否则,您可以使用协议。

0
在我有限的经验中,你应该将图片的 .jpg 格式更改为 .png

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接