使用 [[NSBundle mainBundle] pathForResource 获取 .plist 的路径时出现问题

Posted

技术标签:

【中文标题】使用 [[NSBundle mainBundle] pathForResource 获取 .plist 的路径时出现问题【英文标题】:Problem getting path to .plist using [[NSBundle mainBundle] pathForResource 【发布时间】:2009-11-17 15:46:37 【问题描述】:

我是一个 Objective C 菜鸟,我知道的不足以解释以下问题。

此代码有效:

NSString *plistPath = @"/Users/andrewf/MyApp/Resources/Plates.plist";
dicPlates = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

我的字典对象按预期加载了值。

此代码不起作用:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Plates" ofType:@"plist"];
dicPlates = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

plistPath 返回值为 nil。无论我是否在调用中包含 inDirectory:@"Resources" 都是这种情况。在尝试打开 Resources 目录中的 .plist 文件时,我发现的所有示例都不包括 inDirectory。

我已确认该文件存在于正确的位置,甚至重新创建了它以确保。

这似乎是一个如此简单的问题,但我很困惑。请帮忙。

【问题讨论】:

工作示例中的 /MyApp 目录是构建应用程序的包还是项目目录? 【参考方案1】:

我认为您对pathForResource: 的位置感到困惑。

这行得通:

NSString *plistPath = @"/Users/andrewf/MyApp/Resources/Plates.plist";

请注意,此路径并不指向您的应用程序。它指向您的项目目录。您的 plist 应该位于 @/Users/andrewf/MyApp/build/Release/MyApp.app/Resources/Plist.plist"(对于 iPhone 应用程序,这会有所不同,更像是 @"/Users/andrewf/Library/Application Support/iPhone Simulator/User/Applicatons/(unique id)/MyApp.app/Resources/Plates.plist"),它位于 pathForResource: 正在查找的应用程序的 Resources 文件夹中 .

这意味着您的资源不在构建目标的“复制捆绑资源”阶段。您需要将其从 Groups and Files 区域拖到该阶段内。

【讨论】:

+1 如果 Xcode 看不到它,那么它很可能不在模拟器的 Resources 目录中,除非您手动将它放在 MyApp.app 的正确文件夹中跨度> 【参考方案2】:

我找到了问题!

.plist 文件已正确包含在目标中。

最初创建 .plist 时,我将文件命名为“plates.plist”。创建文件后,我立即将其重命名为“Plates.plist”,这就是我以后使用的。

即使文件在我的资源文件夹中被命名为“Plates.plist”,在目标部分和上面提到的 iPhone 模拟器位置中,该文件也被命名为“plates.plist”。奇怪的是,文件的内容仍然正确更新。

现在我已将代码更改为引用“plates.plist”,并将 Resources 文件夹中的文件重命名为相同,以便更好地衡量,一切正常。我只能假设这是 iPhone SDK 中的一个错误。

【讨论】:

这是一个不区分大小写的问题。如果您只是更改文件名的大小写而不更改文件的内容,则不会删除旧的 .plist。为了在未来解决这些问题,清理然后重新构建。【参考方案3】:

检查plates.plist 文件是否已添加到 Xcode 中的目标。

如果文件没有添加到目标中,它就不会在构建产品中,NSBundle 也不会找到它。

【讨论】:

以上是关于使用 [[NSBundle mainBundle] pathForResource 获取 .plist 的路径时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

未找到 NSBundle mainBundle

NSBundle.mainBundle() 返回 nil

使用来自 [[NSBundle mainBundle] resourcePath] 的路径

NSBundle mainBundle 返回 nil

使用 [NSBundle mainBundle] pathForResource: ofType:inDirectory: 访问文件

无法使用 [[NSBundle mainBundle] pathForResource ofType inDirectory] ​​加载文件