NSBundle pathForResource 返回 nil 和子目录

Posted

技术标签:

【中文标题】NSBundle pathForResource 返回 nil 和子目录【英文标题】:NSBundle pathForResource returns nil with subdirs 【发布时间】:2011-06-28 16:43:02 【问题描述】:

我的应用中有一堆目录和文件,例如images/misc/mainmenu_background.。我在“iPad Simulator 3.2”中运行以下代码:

NSString *images = [[NSBundle mainBundle] pathForResource:@"images" ofType:nil];
NSString *images_misc = [[NSBundle mainBundle] pathForResource:@"images/misc" ofType:nil];
NSString *images_misc_file = [[NSBundle mainBundle] pathForResource:@"images/misc/mainmenu_background.png" ofType:nil];

在此调用之后,images 包含路径 /Users/wic/Library/Application Support/iPhone Simulator/3.2/Applications/8F67150B-71E6-4735-8CC6-38B3CE6D3568/Foo.app/images

但是images_miscimages_misc_filenil。仔细检查我的文件系统以检查文件是否存在:

$ ls -l "/Users/wic/Library/Application Support/iPhone Simulator/3.2/Applications/8F67150B-71E6-4735-8CC6-38B3CE6D3568/Foo.app/images/misc/mainmenu_background.png"
-rw-rw-rw-  1 wic  staff  30307 16 Feb 21:09 /Users/wic/Library/Application Support/iPhone Simulator/3.2/Applications/8F67150B-71E6-4735-8CC6-38B3CE6D3568/Foo.app/images/misc/mainmenu_background.png

显然文件在那里。

如果我切换到“iPad Simulator 4.0”或任何其他模拟器版本,一切都会按预期工作。

我的设置是否有问题,或者 iPad 3.2 中 NSBundle 的这种行为是否正确?不幸的是,我没有实际的物理 iPad 来测试它。

【问题讨论】:

【参考方案1】:

如果您需要访问目录中的文件,您应该使用-[NSBundle pathForResource:ofType:inDirectory:]。所以你的代码应该看起来像

NSString *images_misc_file = [[NSBundle mainBundle] pathForResource:@"mainmenu_background" ofType:@"png" inDirectory:@"images/misc"];

【讨论】:

好的,谢谢。使用inDirectory 似乎有效。但这意味着行为已经(默默地)改变了,因为它在以后的版本中起作用,对吧? 听起来他们改变了处理pathForResource:参数中给出的完整路径的方法,但即使你只支持4.0及更高版本,最好正确使用API​​并使用@987654325所有目录的@参数。 为了记录,这是我正在使用的一个框架,它就是这样做的。奇怪的是,苹果在没有任何通知的情况下改变了这种行为。 他们让它变得更加宽容。可能是重新实现该方法以进行其他更改(例如支持 @2x 或 ~ipad 修饰符)的副作用。【参考方案2】:

尽管已经回答了这个问题,但我想补充一点,-[NSBundle pathForResource:ofType:inDirectory:] 具有不同的大小写敏感性,具体取决于它是 iPhone 模拟器、iPad 模拟器还是设备。例如,iPhone Simulator 4.0 似乎不区分大小写,而在 iPad Simulator 3.2 和设备上 - 区分大小写。因此,如果情况不匹配,在 iPhone 4.0 模拟器上找到的文件可能在 iPad 模拟器 3.2 或设备上找不到。

【讨论】:

感谢您的来信。我只是被区分大小写的差异所困扰。

以上是关于NSBundle pathForResource 返回 nil 和子目录的主要内容,如果未能解决你的问题,请参考以下文章

NSBundle pathForResource is NULL 取不到值

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

NSBundle pathForResource 返回 nil 和子目录

iOS:[NSBundle pathForResource:ofType:inDirectory] ​​返回 nil?

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

NSBundle pathForResource 不适用于子目录本地化?