我正在尝试从图像选择器中选择的视频中获取缩略图,并将缩略图添加到单独的视图控制器中的UIImageView中,但是,我收到错误:
线程1:致命错误:在第二个视图控制器中展开Optional值时意外发现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
}
答案 0 :(得分:0)
目前,您正在将prepareForSegue
函数嵌套在选择器的回调中,因此将其删除并在视图控制器的范围内声明它,因此当您调用performSegue时,该类的videoUrl将分配给该视图的videUrl。 secondVC导致非零。这应该是out并调用performSegue
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL {
self.vidurl = videoUrl
}
else
{
}
performSegue(withIdentifier: "toupload", sender: nil)
}
///
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toupload" {
let uploadvc = segue.destination as! UploadVC
uploadvc.videourl = vidurl
}
}