在“didFinishPickingMediaWithInfo”之后推送到另一个控制器时崩溃

Crash when pushing to another controller after `didFinishPickingMediaWithInfo`

我正在尝试让应用程序在用户从选择器中选择照片后转到不同的视图控制器。

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!) 和一个 post 照片的按钮,所以我试图设置该图像视图以显示选取的图像。

但是,我在 previewController.previewImage.image = image 行遇到崩溃 "unexpectedly found nil when unwrapping an optional value"。 previewController 中的 previewImage 在调试器中为 nil,但我不确定为什么 - 用户在选择器中点击 "choose" 后是否立即设置?

这里还涉及到其他步骤吗?

问题的主要原因是您尝试过早访问视图控制器的出口。实例化视图控制器后,不会立即创建和分配视图控制器的视图和插座。

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

将此添加到您的函数中

dismiss(animated:true, completion: nil)

在完成中,你可以定义一个闭包来做任何你想做的事情。