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
相关产品推荐
相关产品推荐

