NSBundle pathForResource返回带有子目录的nil

时间:2011-02-16 21:48:48

标签: xcode ios-simulator nsbundle

我的应用中有一堆目录和文件,例如images/misc/mainmenu_background.。我在“iPad模拟器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模拟器4.0”或任何其他模拟器版本,一切都按预期工作。

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

2 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:10)

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