`NSBundle.mainBundle().URLForResource` 总是返回 `nil`

Posted

技术标签:

【中文标题】`NSBundle.mainBundle().URLForResource` 总是返回 `nil`【英文标题】:`NSBundle.mainBundle().URLForResource` always returns `nil` 【发布时间】:2014-07-24 15:28:35 【问题描述】:

我是 Swift 新手,正在使用 Xcode 6。

我正在尝试从应用程序的 plist 文件中读取数据,但它不工作。

data.plist 文件包含在 Xcode 的 Supporting Files 组中。

我正在使用下面的代码:

var dataList = NSDictionary(contentsOfURL:NSBundle.mainBundle().URLForResource("data", withExtension:"plist"))

但是 NSURL:

NSBundle.mainBundle().URLForResource("data", withExtension:"plist")

总是返回nil

我不知道怎么了。

【问题讨论】:

您确定 data.plist 文件在您的项目中吗? FWIW,NSBundle.mainBundle().pathForResource 也有类似的问题。我最终使用NSBundle.mainBundle().resourcePath.stringByAppendingPathComponent 和我的文件名(带扩展名)作为参数。 @Kreiri 的工作就像一个魅力,有时 Xcode 只是在版本之间变得愚蠢,相同的代码在 7.1.1 中工作,更新到 7.2 失败。我的资源在 main/resources 中,但找不到它们。如果可以的话 +1 +5 【参考方案1】:

通常您会希望使用此代码来创建您的 plist。这会找到您的 plist 的路径,然后将其移动到文档目录中(如果它不存在)。如果您不移动它,则不允许对其进行写入,因此这段代码至关重要。要从 plist 中获取信息,请使用第二段代码。显然,如果你有一个数组而不是字典,你就必须改变它来处理它。

var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
    path = path.stringByAppendingPathComponent("data.plist")
    let fileManager = NSFileManager.defaultManager()
    if !fileManager.fileExistsAtPath(path) 
        let sourcePath = NSBundle.mainBundle().pathForResource("data", ofType: "plist")
        fileManager.copyItemAtPath(sourcePath, toPath: path, error: nil)

.

let dict = NSMutableDictionary(contentsOfFile: path) as NSMutableDictionary

【讨论】:

以上是关于`NSBundle.mainBundle().URLForResource` 总是返回 `nil`的主要内容,如果未能解决你的问题,请参考以下文章

`NSBundle.mainBundle().URLForResource` 总是返回 `nil`

未找到 NSBundle mainBundle

NSBundle mainBundle 返回 nil

NSBundle mainBundle infoDictionary 返回 NULL

“[[NSBundle mainBundle] objectForInfoDictionaryKey:]” 有时返回 nil

“[[NSBundle mainBundle] objectForInfoDictionaryKey:]” 有时返回 nil