URL 到本地 Bundle.main 总是 returns 无
URL to local Bundle.main always returns nil
概览
我正在为孩子们做一个简单的唱歌游戏。该游戏仅播放一段视频并显示三个选项。我正在更新视频,所以我从 Assets.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
}
}
之前它运行良好。所以我的第一个想法是我没有以正确的方式添加文件,但我再次检查了一下,与视频位于同一文件夹中的按钮显示正确。
正如您在最后一张图片中看到的那样,按钮显示良好并且按钮图片位于同一文件夹中
我检查的第二件事是构建阶段,但所有文件都在正确的文件夹中。
问题
- 为什么收不到文件?
- 如何调试 URL?
如果你想从Assets.xcassets获取数据,你应该使用NSDataAsset like NSDataAsset(name: "color_1")?.data
. You do however get the raw data rather than an URL. So in your implementation it is critical to copy the mp4 file in the Copy Bundle Resources build phase, which will copy it directly to your main app bundle as per Bundle Structures,而不是将它添加到xcassets目录。请确保为您复制的文件使用与代码中使用的文件相同的文件名和扩展名。
如果您将视频文件添加到主包中,通过拖放它并在需要时复制项目,您可以像这样直接访问它们:
let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")
如果您想直接从资产访问您的视频,您可以通过 NSObject
和 NSDataAsset
获取它。
let dataVideo : NSObject = NSDataAsset(name: "MyVideo")!
编辑:
如果您将视频/图像添加到您的 MainBundle,您可以在显示您的应用程序包内容时看到它们。那就是 URL 指向的地方。使用资产,您不会按库存获得 URL。我正在做的是,我将资产的内容作为数据获取,将其复制到我的应用程序的文档文件夹中并将其存储在那里。然后你也会得到那个目录的 URL 。 (这应该是您的最佳解决方案,我会直接将视频复制到您的 Bundle 中)
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(文件: self.url))
好吧,我仍然对发生的事情感到困惑,但这是对我有用的
开始时我使用的是外部磁盘,源代码在那里,所以我很确定这不相关,但我将位置更改为我的本地磁盘。
首先我删除了所有文件,然后在 finder 中我删除了项目文件夹中的真实文件。
然后我将我的资产文件夹复制到项目文件夹中
第三,我将所有文件夹拖到主包中,但我没有检查创建组,而是检查创建文件夹引用
所以我的所有文件夹都变成黄色(当我拖动文件夹并检查创建组时,内部文件夹变成蓝色)
4 我将黄色文件夹拖放到 Assets.xcassets(文件夹上还有每个视频的图像按钮)
和 运行 又一次所以它再次工作
所以现在它又开始工作了,感谢大家的帮助,我认为关键是要将真实文件放在捆绑包中并进行目标检查。
概览
我正在为孩子们做一个简单的唱歌游戏。该游戏仅播放一段视频并显示三个选项。我正在更新视频,所以我从 Assets.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
}
}
之前它运行良好。所以我的第一个想法是我没有以正确的方式添加文件,但我再次检查了一下,与视频位于同一文件夹中的按钮显示正确。
正如您在最后一张图片中看到的那样,按钮显示良好并且按钮图片位于同一文件夹中
问题
- 为什么收不到文件?
- 如何调试 URL?
如果你想从Assets.xcassets获取数据,你应该使用NSDataAsset like NSDataAsset(name: "color_1")?.data
. You do however get the raw data rather than an URL. So in your implementation it is critical to copy the mp4 file in the Copy Bundle Resources build phase, which will copy it directly to your main app bundle as per Bundle Structures,而不是将它添加到xcassets目录。请确保为您复制的文件使用与代码中使用的文件相同的文件名和扩展名。
如果您将视频文件添加到主包中,通过拖放它并在需要时复制项目,您可以像这样直接访问它们:
let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")
如果您想直接从资产访问您的视频,您可以通过 NSObject
和 NSDataAsset
获取它。
let dataVideo : NSObject = NSDataAsset(name: "MyVideo")!
编辑:
如果您将视频/图像添加到您的 MainBundle,您可以在显示您的应用程序包内容时看到它们。那就是 URL 指向的地方。使用资产,您不会按库存获得 URL。我正在做的是,我将资产的内容作为数据获取,将其复制到我的应用程序的文档文件夹中并将其存储在那里。然后你也会得到那个目录的 URL 。 (这应该是您的最佳解决方案,我会直接将视频复制到您的 Bundle 中)
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(文件: self.url))
好吧,我仍然对发生的事情感到困惑,但这是对我有用的
开始时我使用的是外部磁盘,源代码在那里,所以我很确定这不相关,但我将位置更改为我的本地磁盘。
首先我删除了所有文件,然后在 finder 中我删除了项目文件夹中的真实文件。
然后我将我的资产文件夹复制到项目文件夹中
第三,我将所有文件夹拖到主包中,但我没有检查创建组,而是检查创建文件夹引用
所以我的所有文件夹都变成黄色(当我拖动文件夹并检查创建组时,内部文件夹变成蓝色)
4 我将黄色文件夹拖放到 Assets.xcassets(文件夹上还有每个视频的图像按钮)
和 运行 又一次所以它再次工作
所以现在它又开始工作了,感谢大家的帮助,我认为关键是要将真实文件放在捆绑包中并进行目标检查。