You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:使用Segue在ViewController间传递图片失败问题排查

解决Storyboard Segue传递图片时目标VC接收为空的问题

哥们,你这明显是把手动实例化ViewController和Storyboard Segue跳转两种方式混在一起用了,这就是图片传不过去的核心原因!

为什么会出现这个问题?

你在按钮点击事件里手动实例化了EditImageViewController并给imageForEdit赋值,但这个实例根本没被用来跳转——因为当你通过Storyboard的Segue触发跳转时,系统会自动创建一个全新的EditImageViewController实例,这个新实例的imageForEdit是默认状态(要么是nil,要么是尺寸为{0,0}的空图片),所以你在VC2里打印的其实是这个没被赋值的新实例的属性,而不是你之前手动创建的那个。

正确的解决方案

根据你用Segue的方式,分两种情况处理:

情况1:按钮直接关联Segue(Storyboard拖拽关联)

  1. 先给Segue设置唯一标识符:在Storyboard里选中你从VC1到VC2的Segue,打开右侧Attributes Inspector,在Identifier栏填写一个专属名称(比如GoToEditImageVC)。
  2. 在VC1里实现prepare(for:sender:)方法,在这里完成传值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 先判断Segue标识符是否匹配
    guard segue.identifier == "GoToEditImageVC", 
          let editVC = segue.destination as? EditImageViewController else {
        return
    }
    // 把要传递的图片赋值给目标VC的属性
    editVC.imageForEdit = self.imageView.image
    print("准备传递的图片尺寸:\(editVC.imageForEdit?.size ?? .zero)")
}
  1. 按钮的点击事件不需要做任何实例化操作,保持默认即可(因为拖拽关联后点击按钮会自动触发Segue)。

情况2:手动调用Segue跳转(按钮点击事件里触发Segue)

  1. 同样先给Segue设置好标识符。
  2. 按钮点击事件里只需要触发Segue,不要手动实例化VC:
@IBAction func editButtonTapped(_ sender: UIButton) {
    // 触发Segue,传递sender(这里传self即可)
    performSegue(withIdentifier: "GoToEditImageVC", sender: self)
}
  1. 同样在VC1的prepare(for:sender:)方法里完成传值,代码和上面一致。

额外需要检查的细节

  • VC2的属性定义:确保imageForEdit是可选的UIImage?类型,不要提前初始化为空图片:
class EditImageViewController: UIViewController {
    // 正确的定义方式
    var imageForEdit: UIImage?
    // 错误的定义方式(会提前生成空图片,导致尺寸为{0,0})
    // var imageForEdit = UIImage()
}
  • VC2的打印时机:不要在init或者awakeFromNib里打印imageForEdit,因为这时候Segue的传值还没完成,要在viewDidLoad或者之后的生命周期方法里打印:
override func viewDidLoad() {
    super.viewDidLoad()
    print("接收的图片尺寸:\(imageForEdit?.size ?? .zero)")
    // 在这里把图片赋值给VC2的imageView
    if let image = imageForEdit {
        self.editImageView.image = image
    }
}

内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:49:22