Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从视频中捕获静止图像并添加到单独的viewcontroller Swift中的图像视图_Ios_Swift - Fatal编程技术网

Ios 从视频中捕获静止图像并添加到单独的viewcontroller Swift中的图像视图

Ios 从视频中捕获静止图像并添加到单独的viewcontroller Swift中的图像视图,ios,swift,Ios,Swift,我正在尝试从从图像选择器中选择的视频中获取缩略图,并将缩略图添加到单独视图控制器中的UIImageView中,但是,我遇到了错误: 线程1:致命错误:在第二个视图控制器中展开可选值时意外发现nil @IBOutlet weak var previewImage: UIImageView! var videourl: URL? override func viewDidLoad() { super.viewDidLoad() previewImage.image = th

我正在尝试从从图像选择器中选择的视频中获取缩略图,并将缩略图添加到单独视图控制器中的UIImageView中,但是,我遇到了错误:

线程1:致命错误:在第二个视图控制器中展开可选值时意外发现nil

@IBOutlet weak var previewImage: UIImageView!


var videourl: URL?


override func viewDidLoad() {
    super.viewDidLoad()

    previewImage.image = thumbnailImageForFileUrl(videourl!) Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

}

func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
    let asset = AVAsset(url: fileUrl)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    do {
        let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(7, 1), actualTime: nil)
        return UIImage(cgImage: thumbnailCGImage)
    } catch let err {
        print(err)
    }

    return nil
}
我知道错误的意思,只是不明白为什么缩略图没有传递到UIImageView中的下一个视图控制器

这是我的第一个视图控制器代码

    @IBAction func upload(_ sender: Any) {
      let pickerController = UIImagePickerController()
      pickerController.delegate = self
      pickerController.mediaTypes = ["public.movie"]
      present(pickerController, animated: true, completion: nil)  
 }
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
        self.vidurl = videoUrl
            func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                if segue.identifier == "toupload" {
                    let uploadvc = segue.destination as! UploadVC
                    uploadvc.videourl = vidurl
                }
            }
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{
        func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "toupload" {
                let uploadvc = segue.destination as! UploadVC
                uploadvc.previewImage.image = image
            }
        }
    }
    performSegue(withIdentifier: "toupload", sender: nil)
  }
    dismiss(animated: true, completion: nil) 
}
下面是第二个视图控制器的代码

@IBOutlet weak var previewImage: UIImageView!


var videourl: URL?


override func viewDidLoad() {
    super.viewDidLoad()

    previewImage.image = thumbnailImageForFileUrl(videourl!) Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

}

func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
    let asset = AVAsset(url: fileUrl)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    do {
        let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(7, 1), actualTime: nil)
        return UIImage(cgImage: thumbnailCGImage)
    } catch let err {
        print(err)
    }

    return nil
}

当前,您将
prepareforsgue
函数嵌套在选择器的回调中,因此将其删除并在视图控制器的范围内声明,以便在调用performsgue时,将类的videoUrl分配给第二个VC的videoUrl,从而得到非nil。这应该是出来的,并调用performsgue

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
    self.vidurl = videoUrl
  }
  else
  {
   }
    performSegue(withIdentifier: "toupload", sender: nil)

 } 
///


贾斯汀,你在网上查过了吗。有大量的文章和教程解释如何通过控制器传递数据。@GuiDupas是的,我搜索过互联网和所有关于使用func prepare(对于segue:UIStoryboardSegue,sender:Any?)函数的内容。所以使用它吧。在类内而不是在方法内创建2个变量,使用方法保存变量上的值并使用
prepare(对于segue:UIStoryboardSegue,sender:Any?
@guidup,因为它起作用了!谢谢。这个很好用。谢谢