Swift执行segue从HomeViewController跳转PreviewViewController出现image相关报错
问题根因
两个报错都指向同一个核心问题:你没有在HomeViewController中声明用于存储拍摄结果的image属性,代码中两处对image的读写操作都没有对应变量支撑。
同时你的代码还存在3处隐性问题会导致跳转后无图、跳转逻辑不生效:
- segue标识判断多写了末尾空格,匹配不到你在Storyboard设置的
"showPhoto" - 拍照按钮点击后立刻执行跳转,此时拍照还未完成,还没生成图片
- 直接给
PreviewViewController的UIImageView类型IBOutlet赋值UIImage,要么崩溃要么赋值不生效
修复步骤
第一步:给HomeViewController加存储图片的属性
在HomeViewController的属性声明区域新增如下代码:
var capturedImage: UIImage?
修改photoOutput回调中的赋值逻辑,把生成的图片存到这个属性里:
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { if let imageData = photo.fileDataRepresentation() { // 替换原来的image = ... capturedImage = UIImage(data: imageData) performSegue(withIdentifier: "showPhoto", sender: nil) } }
第二步:修复prepare方法的两处错误
- 删掉segue标识末尾的多余空格
- 给PreviewViewController的imageView正确赋值
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 去掉原来的末尾空格 if segue.identifier == "showPhoto" { let previewVC = segue.destination as! PreviewViewController // 给UIImageView的image属性赋值,而不是直接给UIImageView赋值 previewVC.image.image = capturedImage } }
第三步:删掉拍照按钮中多余的跳转代码
你在camerabtn点击方法中执行的跳转是多余的,会在拍照未完成时就触发跳转,直接删除该方法中的这一行:
performSegue(withIdentifier: "showPhoto", sender: nil)
可选优化(推荐)
避免直接操作PreviewViewController的IBOutlet,防止控制器未加载完成时IBOutlet为nil导致赋值失效,给PreviewViewController新增一个接收图片的属性:
class PreviewViewController: UIViewController { // 新增接收图片的属性 var receivedImage: UIImage? @IBOutlet weak var image : UIImageView! override func viewDidLoad() { super.viewDidLoad() // 页面加载完成后再给imageView赋值 image.image = receivedImage } // 其余原有代码保持不变 }
对应的prepare方法中的赋值逻辑修改为:
previewVC.receivedImage = capturedImage
内容的提问来源于stack exchange,提问作者Wen Love Howard
相关产品推荐
相关产品推荐

