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

时间:2017-03-19 15:19:59

标签: ios swift uiimagepickercontroller

在用户从选择器中选择照片后,我试图让应用程序转到其他视图控制器。

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

然而,当我解开一个可选值时,我发现了一个崩溃"意外地发现了nil"在previewController.previewImage.image = image行。在调试器中,previewController中的previewImage是nil,但我不确定为什么 - 一旦用户点击"选择"在选择器?

这里有另一步吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

将此添加到您的功能

dismiss(animated:true, completion: nil)

在完成时,您可以定义一个可以执行任何操作的闭包。