Swift 指向本地Bundle.main的URL始终返回nil

Swift 指向本地Bundle.main的URL始终返回nil,swift,url,swiftui,avplayeritem,Swift,Url,Swiftui,Avplayeritem,概述 我正在为孩子们做一个简单的唱歌游戏。游戏只播放一个视频,显示三个选项。我正在更新视频,所以我从Assets.xcsets中删除了它,然后添加了新的视频 问题 现在我得到了这个错误: Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /Volumes/Documentos/Trabajo/Codigo proyectos/Currents/HANDSUP/diloEnSenas/Sings

概述

我正在为孩子们做一个简单的唱歌游戏。游戏只播放一个视频,显示三个选项。我正在更新视频,所以我从Assets.xcsets中删除了它,然后添加了新的视频

问题

现在我得到了这个错误:

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.xcsets获取数据,应使用like
NSDataAsset(名称:“color_1”)?.data
。但是,您确实获得了原始数据,而不是URL。因此,在您的实现中,在复制捆绑包资源构建阶段复制mp4文件是至关重要的,这将根据将其直接复制到主应用程序捆绑包中,而不是将其添加到xcassets目录中。确保复制的文件使用与代码中使用的文件相同的文件名和扩展名。

如果要从Assets.xcsets获取数据,应使用like
NSDataAsset(名称:“color_1”)?.data
。但是,您确实获得了原始数据,而不是URL。因此,在您的实现中,在复制捆绑包资源构建阶段复制mp4文件是至关重要的,这将根据将其直接复制到主应用程序捆绑包中,而不是将其添加到xcassets目录中。请确保您复制的文件与代码中使用的文件使用相同的文件名和扩展名。

如果您将视频文件添加到主捆绑包中,通过拖放它,并在需要时复制项目,您可以直接访问它们,如下所示:

let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")
如果要直接从资源访问视频,可以使用
NSDataAsset
NSObject
的形式获取视频

let dataVideo : NSObject = NSDataAsset(name: "MyVideo")!
编辑:


如果将视频/图像添加到主捆绑包中,则可以在显示应用程序包内容时看到它们。这就是URL指向的位置。使用资产,您不会通过股票获得URL。我所做的是,将资产的内容作为数据,复制到应用程序的Documents文件夹中并存储在那里。然后你也会得到一个指向该目录的URL。(对于您的情况,这应该是最佳解决方案,我会直接将视频复制到您的捆绑包)

如果您将视频文件添加到主捆绑包中,通过拖放它,并在需要时复制项目,您可以直接访问它们,如下所示:

let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")
如果要直接从资源访问视频,可以使用
NSDataAsset
NSObject
的形式获取视频

let dataVideo : NSObject = NSDataAsset(name: "MyVideo")!
编辑:

如果将视频/图像添加到主捆绑包中,则可以在显示应用程序包内容时看到它们。这就是URL指向的位置。使用资产,您不会通过股票获得URL。我所做的是,将资产的内容作为数据,复制到应用程序的Documents文件夹中并存储在那里。然后你也会得到一个指向该目录的URL。(这应该是您案例的最佳解决方案,我会直接将视频复制到您的捆绑包中)

包装url参数并对以下内容进行修改: VideoPlayerView(playerQueve:self.changeVideo(文件:self.url))

包装url参数并对以下内容进行修改:
VideoPlayerView(playerQueve:self.changeVideo(file:self.url))

好的,我仍然对发生的事情感到非常困惑,但以下是对我有效的方法

首先,我使用的是一个外部磁盘,源代码就在那里,所以我很确定它没有关系,但我将位置更改为我的本地磁盘

首先,我删除所有文件,同时在finder中删除项目文件夹中的真实文件

其次,我将资产文件夹复制到项目文件夹中的finder中

第三,我将所有文件夹拖到主捆绑包中,但不选中创建组,而是选中创建文件夹引用

这样,我的所有文件夹都变为黄色(当我拖动文件夹时,选中“创建组”,内部文件夹将变为蓝色)

四我将黄色文件夹拖放到Assets.xcsets(文件夹上还有每个视频的图像按钮)

然后再次运行,使其再次工作


现在它又开始工作了,谢谢大家的帮助,我想关键是要有包中的真实文件和目标检查。

好的,我仍然对发生的事情感到困惑,但以下是对我有效的方法

首先,我使用的是一个外部磁盘,源代码就在那里,所以我很确定它没有关系,但我将位置更改为我的本地磁盘

首先,我删除所有文件,同时在finder中删除项目文件夹中的真实文件

其次,我将资产文件夹复制到项目文件夹中的finder中

第三,我将所有文件夹拖到主捆绑包中,但不选中创建组,而是选中创建文件夹引用

这样,我的所有文件夹都变为黄色(当我拖动文件夹时,选中“创建组”,内部文件夹将变为蓝色)

四我将黄色文件夹拖放到Assets.xcsets(文件夹上还有每个视频的图像按钮)

然后再次运行,使其再次工作


现在它又开始工作了,谢谢大家的帮助,我想关键是在捆绑包中有真实的文件和目标检查。

你能选择你的文件,打开正确的检查器并检查目标成员身份吗?@davidev是的,我只是更新了任务你能选择你的文件吗,打开正确的检查器并检查目标成员资格?@davidev是的,我只是更新了问题