在`didFinishPickingMediaWithInfo`之后推送到另一个控制器时发生崩溃

我试图让用户从select器中select一张照片后,应用程序转到不同的视图控制器。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let image = info[UIImagePickerControllerEditedImage] as? UIImage { let previewController = self.storyboard?.instantiateViewController(withIdentifier: "previewVC") as! PreviewViewController previewController.previewImage.image = image previewController.navigationItem.setHidesBackButton(true, animated: false) self.navigationController?.pushViewController(previewController, animated: true) } } 

previewController只是有一个图像视图( @IBOutlet weak var previewImage: UIImageView!图像@IBOutlet weak var previewImage: UIImageView! )和一个button来张贴照片,所以我试图设置图像视图来显示select的图像。

不过,我在previewController.previewImage.image = image行中发生了一个崩溃,意外地发现了“当展开一个可选值时发现了nil”。 previewImage中的previewImage在debugging器中为零,但我不确定为什么 – 只要用户在select器中select“choose”,是不是被设置?

这里涉及到另一个步骤吗?

问题的主要原因是您尝试访问视图控制器的sockets太早。 视图控制器的视图和sockets不是在实例化视图控制器后立即创build和分配的。

试图从该视图控制器之外的代码直接访问视图控制器的视图也是一个糟糕的devise。 在这种情况下,适当的解决scheme是添加可以设置的UIImage属性。 然后让视图控制器在适当的时候根据该图像属性的值更新自己的图像视图(如viewDidLoad )。

添加到您的function

 dismiss(animated:true, completion: nil) 

在完成时,你可以定义一个闭包,做任何你想要的。