NSBundle pathForResource返回带有子目录的nil

Mar*_*man 12 xcode nsbundle ios-simulator

例如,我的应用程序中有一堆目录和文件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];
Run Code Online (Sandbox Code Playgroud)

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

但是images_misc,images_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
Run Code Online (Sandbox Code Playgroud)

显然文件就在那里.

如果我切换到"iPad模拟器4.0",或任何其他模拟器版本的一切都按预期工作.

我的设置有问题,或者NSBundle在iPad 3.2中这是正确的行为吗?不幸的是,我没有真正的物理iPad来测试它.

Lil*_*ard 23

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

NSString *images_misc_file = [[NSBundle mainBundle] pathForResource:@"mainmenu_background" ofType:@"png" inDirectory:@"images/misc"];
Run Code Online (Sandbox Code Playgroud)


mt_*_*mt_ 10

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

  • 谢谢你的说明.我只是被区分大小写的区别所灼伤. (3认同)