【问题标题】:URL to local Bundle.main always returns nil本地 Bundle.main 的 URL 总是返回 nil
【发布时间】:2020-05-12 19:35:40
【问题描述】:

概述

我正在为孩子们做一个简单的歌唱游戏。游戏只是播放一段视频并显示三个选项。我正在更新视频,所以我将其从 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?

【问题讨论】:

  • 您可以选择您的文件,打开正确的 Inspector 并检查 Target 会员资格吗?
  • @davidev 是的,我只是更新了任务

标签: swift url swiftui avplayeritem


【解决方案1】:

好吧,我仍然对发生的事情感到非常困惑,但这对我有用

首先我使用的是外部磁盘,源代码在那里,所以我很确定不相关,但我将位置更改为我的本地磁盘。

首先我删除所有文件,然后在查找器中删除项目文件夹中的真实文件。

然后我将我的资产文件夹复制到项目文件夹中

第三,我将所有文件夹拖到主包,但不是检查创建组,而是检查创建文件夹引用

这样我所有的文件夹都会变成黄色(当我拖动文件夹并检查创建组时,里面的文件夹会变成蓝色)

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

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

所以现在它再次工作了,感谢大家的帮助,我认为关键在于将真实文件放在捆绑包中并进行目标检查。

【讨论】:

  • 这是对我有用的答案。我花了半天的时间苦苦挣扎,直到按照您建议的方式重新完成所有操作,并且终于奏效了。非常感谢!
  • @BryanDeemer 太棒了!我认为创建文件夹引用是关键
【解决方案2】:

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

let url = Bundle.main.url(forResource: "Test" , withExtension: "mov")

如果您想直接从资产访问您的视频,您可以使用NSObjectNSDataAsset 获取它。

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

编辑:

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

【讨论】:

  • 感谢这是对我有更多帮助的答案:D 我无法修复它并再次运行
【解决方案3】:

如果你想从 Assets.xcassets 中获取数据,你应该使用 NSDataAssetNSDataAsset(name: "color_1")?.data。但是,您确实获得了原始数据而不是 URL。因此,在您的实现中,在 Copy Bundle Resources 构建阶段复制 mp4 文件至关重要,这将按照Bundle Structures 将其直接复制到您的主应用程序包中,而不是将其添加到 xcassets目录。确保复制的文件与代码中使用的文件名和扩展名相同。

【讨论】:

    【解决方案4】:
    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))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 2017-03-28
      • 2015-03-05
      • 2014-08-25
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多