iOS开发:使用Segue在ViewController间传递图片失败问题排查
解决Storyboard Segue传递图片时目标VC接收为空的问题
哥们,你这明显是把手动实例化ViewController和Storyboard Segue跳转两种方式混在一起用了,这就是图片传不过去的核心原因!
为什么会出现这个问题?
你在按钮点击事件里手动实例化了EditImageViewController并给imageForEdit赋值,但这个实例根本没被用来跳转——因为当你通过Storyboard的Segue触发跳转时,系统会自动创建一个全新的EditImageViewController实例,这个新实例的imageForEdit是默认状态(要么是nil,要么是尺寸为{0,0}的空图片),所以你在VC2里打印的其实是这个没被赋值的新实例的属性,而不是你之前手动创建的那个。
正确的解决方案
根据你用Segue的方式,分两种情况处理:
情况1:按钮直接关联Segue(Storyboard拖拽关联)
- 先给Segue设置唯一标识符:在Storyboard里选中你从VC1到VC2的Segue,打开右侧Attributes Inspector,在
Identifier栏填写一个专属名称(比如GoToEditImageVC)。 - 在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)") }
- 按钮的点击事件不需要做任何实例化操作,保持默认即可(因为拖拽关联后点击按钮会自动触发Segue)。
情况2:手动调用Segue跳转(按钮点击事件里触发Segue)
- 同样先给Segue设置好标识符。
- 按钮点击事件里只需要触发Segue,不要手动实例化VC:
@IBAction func editButtonTapped(_ sender: UIButton) { // 触发Segue,传递sender(这里传self即可) performSegue(withIdentifier: "GoToEditImageVC", sender: self) }
- 同样在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
相关产品推荐
相关产品推荐

