NSBundle.mainBundle()。URLForResource(“bach1”,withExtension:“jpg”)返回null

时间:2015-02-26 17:14:54

标签: swift

NSBundle.mainBundle().URLForResource("bach1", withExtension: "jpg")

上面的代码返回null。

为了检查文件是否存在,我使用了以下代码:

let fileManager = NSFileManager.defaultManager()

if fileManager.fileExistsAtPath(savepath) {
  println("exist")
}

上面的代码返回该文件存在于目录中。

所以我不明白为什么第一个代码返回null

5 个答案:

答案 0 :(得分:12)

你的问题是NSBundle.mainBundle()。URLForResource(“bach1”,withExtension:“jpg”)返回一个可选的NSURL。您需要使用if let打开它并从返回的URL中提取文件路径,如下所示:

if let resourceUrl = NSBundle.mainBundle().URLForResource("bach1", withExtension: "jpg") {
    if NSFileManager.defaultManager().fileExistsAtPath(resourceUrl.path!) {
        print("file found")
    }
}

答案 1 :(得分:8)

  

Swift 3.x

if let resourceUrl = Bundle.main.url(forResource: "bach1", withExtension: "jpg") {
    if FileManager.default.fileExists(atPath: resourceUrl.path) {
        print("file found")
    }
}

答案 2 :(得分:3)

我发现你必须真正进入Build Phases - >复制捆绑资源并有时手动将项目添加到捆绑包中。就我而言,它是一个视频文件,并没有正确地添加到捆绑包中。

答案 3 :(得分:2)

NSBundle.URLForResource仅返回在构建/编译时捆绑在应用程序中的文件,例如将文件拖入Xcode项目并将其添加到应用程序目标时。当您的应用程序预装了您需要的资源(如图像,电影,数据库和其他文件)时,通常可以使用此功能。

似乎savepath是您的应用程序在运行时写入的路径(可能是您的应用程序的Documents目录?)。因此,该文件位于包之外,如果您将来需要引用该文件,则需要将该路径/ URL存储在某处(或重新构建)。

答案 4 :(得分:1)

我也有这个问题。我的修复是:

  • 在项目导航器中选择文件
  • 打开'文件检查器' (在右侧窗格上)
  • 检查目标成员中的应用目标