使用 [[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] resourcePath] 的路径
使用 [NSBundle mainBundle] pathForResource: ofType:inDirectory: 访问文件
无法使用 [[NSBundle mainBundle] pathForResource ofType inDirectory] 加载文件