概述
我在为孩子们做一个简单的唱歌游戏。游戏只是播放一个视频,并显示三个选项。我在更新视频,所以我把它删除了从 资产.xcassets 然后添加新的。
问题是
现在我得到了这个错误。
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Volumes/Documentos/Trabajo/Codigo proyectos/Currents/HANDSUP/diloEnSenas/SingsCategoryView.swift, line 69
2020-05-12 14:03:46.769427-0500 HandsUP[12221:549710] Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Volumes/Documentos/Trabajo/Codigo proyectos/Currents/HANDSUP/diloEnSenas/SingsCategoryView.swift, line 69
这是我遇到问题的代码
struct video: View {
var url: String
var body: some View{
VideoPlayerView(playerQueve: self.changeVideo(file: self.url))
}
func changeVideo(file: String) -> AVQueuePlayer {
//let fileURL = file
//let url = Bundle.main.url(forResource: fileURL , withExtension: "mp4")
let url = Bundle.main.url(forResource: "color_1" , withExtension: "mp4")
let playerItem = AVPlayerItem(url: url!)
//set video
let player = AVQueuePlayer(playerItem: playerItem)
return player
}
}
之前还能正常使用。所以我首先想到的是我添加文件的方式不对,但是我又检查了一下,和视频在同一个文件夹里的按钮都能正常显示。
像你可以看到最后一张图中的按钮显示得很好,按钮图片也在同一个文件夹中。
疑问
如果你把你的视频文件添加到你的主捆绑,通过拖放和复制项目,如果需要的话,你可以直接访问他们这样。
let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")
如果你想直接从资产中访问你的视频,你可以把它作为 NSObject
与 NSDataAsset
.
let dataVideo : NSObject = NSDataAsset(name: "MyVideo")!
编辑。
如果你把你的视频图像添加到你的MainBundle中,你可以在显示你的应用程序的包内容时看到它们。这就是URL指向的地方。有了资产,你就不会通过股票得到一个URL。我现在做的是,我把asset的内容以数据的形式获取,把它复制到我的应用程序的Documents文件夹中,然后存储在那里。然后你也会得到一个到该目录的URL。(这应该是你的最佳解决方案,我会直接把视频复制到你的Bundle里)
如果您想从Assets.xcassets获取数据,您应该使用 NSDataAsset 喜欢 NSDataAsset(name: "color_1")?.data
. 然而,你得到的是原始数据,而不是一个URL。所以在你的实施中,关键是要把mp4文件复制在 复制捆绑资源 构建阶段,它将直接复制到您的主应用程序捆绑,按照 捆绑结构而不是将其添加到xcassets目录中。确保你复制的文件的文件名和扩展名与你的代码中使用的文件相同。
func changeVideo(file: String) -> AVQueuePlayer? {
//let fileURL = file
//let url = Bundle.main.url(forResource: fileURL , withExtension: "mp4")
If let url = Bundle.main.url(forResource: "color_1" , withExtension: "mp4”) {
let playerItem = AVPlayerItem(url: url)
//set video
let player = AVQueuePlayer(playerItem: playerItem)
return player
}
else {
return nil
}
}
封装url参数并修改为:VideoPlayerView(playerQueve: self.changeVideo(file: self.url))
好吧,我还是很困惑发生了什么,但这里是什么工作对我来说。
开始,我使用的是外部磁盘的源代码在那里,所以我非常肯定的是不相关的,但我改变位置到我的本地磁盘。
首先,我删除了所有的文件,也在finder中删除了真正的文件在项目上的文件夹。
第二,然后我复制我的资产文件夹白Finder在项目文件夹中
第三,我把所有的文件夹拖到主捆绑中,但我没有检查创建组,而是检查创建文件夹引用。
因此,我的所有文件夹都是黄色的(当我拖动文件夹并选中创建组时,里面的文件夹就变成蓝色的了
四、我把黄色文件夹拖放到Assets.xcassets中(我把每个视频的图片按钮也放在文件夹上了
并重新运行,所以它再次工作
所以,现在它的工作再次感谢所有的帮助,我认为关键是有真正的文件在捆绑和目标检查。