NSBundle pathForResource возвращает nil с subdirs

У меня есть куча каталогов и файлов в моем приложении, например 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_misc и images_misc_file - nil. Двойная проверка файловой системы, чтобы проверить, есть ли файл:

$ 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" или любую другую версию симулятора, все будет работать так, как ожидалось.

Что-то не так с моей настройкой, или это правильное поведение для NSBundle в iPad 3.2? У меня нет реального физического iPad, чтобы проверить его, к сожалению.

Ответ 1

Если вам нужен доступ к файлу в каталоге, вы должны использовать -[NSBundle pathForResource:ofType:inDirectory:]. Поэтому ваш код должен выглядеть как

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

Ответ 2

Несмотря на то, что уже был дан ответ, я хотел бы добавить, что -[NSBundle pathForResource:ofType:inDirectory:] имеет различную чувствительность к регистру, в зависимости от того, является ли это симулятором iPhone или симулятором iPad или устройством. Например, iPhone Simulator 4.0 кажется нечувствительным к регистру, в то время как на iPad Simulator 3.2 и устройстве - чувствительным к регистру. Таким образом, файлы, найденные на симуляторе iPhone 4.0, не могут быть найдены на IPad Simulator 3.2 или устройстве, если случаи не совпадают.