pathForResource返回null。

41

我正在尝试在我的项目中加载一些 .applescript 文件。

将它们复制到 "Supporting Files" 目录中,如下所示:

enter image description here

并尝试访问它们:

NSBundle *bundle = [NSBundle mainBundle];
NSLog(@"Resource path for test.applescript: %@", [bundle pathForResource:@"test" ofType:@"applescript"]);

pathForResource始终返回null。

两个文件都已正确导入xcode。目标成员资格是我的应用程序。 来自类似问题的解决方案并没有真正帮助到我。

我做错了什么?

6个回答

159
在Xcode的目标“Build Phases”中,将文件添加到“Copy Bundle Resources”下。

1
拖放在Xcode 4.5中仍然存在问题:(例如,从Finder拖动苹果自己的OpenGL着色器到项目中未能将它们添加到复制包资源阶段(为什么?对于苹果来说,这肯定不是难事!)。唉。 - Adam
我遇到了相同的问题,但是文件已经被添加到“复制包资源”阶段,所以那不是问题所在。我所做的(尽管这很奇怪,可能指向我当前的Xcode IDE中存在错误)是将这些相关文件从项目组(文件夹)移动到项目根目录(Xcode 5.1.1)。注意! - igraczech
1
天啊,我花了二十分钟才找到该点击哪里。希望我能为您添加一张截图。 - Adam Loving
把它发给我,我会添加它。 - zaph
谢谢你救了我!我正在使用Xcode版本14.2(14C18)。距离你发布答案已经过去10年了。 - cxwangyi

5
对于那些仍然收到空路径的人,而文件已经添加到“复制束资源”中,只需从“复制束资源”中删除该文件,然后再次添加即可。

1

Zaph的回答非常好,但我注意到在Xcode 6.1中有更快的方法。

如果你单击文件(例如test.applescript)并且打开Xcode的右键菜单,你会看到一个名为“Target Membership”的部分。确保选择了正确的目标(即你正在使用脚本的目标),它将执行与在“Copy Bundle Resources”下添加文件相同的工作。

另外,虽然不完全相关,但如果你从几个不同的地方加载,或者你继承了这个类。你不应该真正使用

[NSBundle mainBundle];

而是使用

[NSBundle bundleForClass:[self class]];

那意味着您不必担心在方法调用中所处的位置,它将从与您正在运行的目标相关联的适当项目中获取资源。非常适合创建库和可重复使用的调用 ;)

0
你的图片是否假定在某个文件夹中?
在这种情况下,可以尝试使用pathForResource:ofType:inDirectory:方法:
NSLog(@"Resource path for test.applescript: %@", [bundle pathForResource:@"test" ofType:@"applescript" inDirectory:@"folder/Supporting Files");

0
除了Zaph所说的,一定要确保你没有在“发布”模式下运行。
曾经有一次我忘记改回那个设置,符号被剥离,因此使NSBundle无法解析路径。

0

如果你在应用程序启动时遇到此问题,请注意[bundle pathForResource]不能在applicationDidFinishLaunching之前起作用。

另外,确保你从主线程中运行它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接