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

Swift:从相册选图并在不同ViewController显示ImageView问题

问题原因

报错的核心是:刚实例化的AddPostViewController还未加载它的view,因此通过IBOutlet连接的postImage处于nil状态,直接调用moreDetail.postImage.image会触发隐式解包的nil错误。

解决步骤

1. 修改目标ViewController,添加图片属性

在AddPostViewController中新增一个用于接收图片的属性,然后在view加载完成后再给imageView赋值:

class AddPostViewController: UIViewController {
    @IBOutlet weak var postImage: UIImageView!
    // 新增可选UIImage属性,用于接收传递的图片
    var selectedImage: UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()
        // 当view加载完成后,将属性中的图片赋值给imageView
        if let image = selectedImage {
            postImage.image = image
        }
    }
}

2. 修改图片选择代理方法,传递图片到属性中

把原来直接操作未初始化imageView的逻辑,改成给新增的属性赋值:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let moreDetail = storyboard.instantiateViewController(identifier: "AddPostViewController") as! AddPostViewController
    picker.dismiss(animated: true, completion: nil)
    
    // 优先取编辑后的图片,没有则取原始图片,避免空值
    guard let selectedImage = info[.editedImage] as? UIImage ?? info[.originalImage] as? UIImage else {
        return
    }
    
    // 给目标VC的属性赋值,而非直接操作imageView
    moreDetail.selectedImage = selectedImage
    self.navigationController?.pushViewController(moreDetail, animated: true)
}
额外提示
  • 不要在view未加载时直接访问IBOutlet元素,所有UI相关操作都应放在viewDidLoad或之后的生命周期方法中。
  • 处理图片时同时兼容editedImage和originalImage,避免用户未编辑图片时无法获取到图片的情况。

内容的提问来源于stack exchange,提问作者neofliesgtt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:10:31