2011-02-16 13 views
11

Tengo un montón de directorios y archivos en mi aplicación, por ejemplo images/misc/mainmenu_background.. Estoy corriendo el código siguiente en el "Simulador de iPad 3.2":NSBundle pathForResource devuelve nil con subdirectorios

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]; 

Después de esta llamada, images contiene la ruta /Users/wic/Library/Application Support/iPhone Simulator/3.2/Applications/8F67150B-71E6-4735-8CC6-38B3CE6D3568/Foo.app/images.

Pero images_misc y images_misc_file son nil. Comprobando dos veces mi sistema de archivos para verificar si el archivo está allí:

$ 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 

Aparentemente el archivo está allí.

Si cambio a "iPad Simulator 4.0", o cualquier otra versión del simulador para ese asunto, todo funciona como se esperaba.

¿Hay algún problema con mi configuración, o es este comportamiento correcto para NSBundle en iPad 3.2? No tengo un iPad físico real para probarlo desafortunadamente.

Respuesta

21

Si necesita acceder a un archivo en un directorio, en su lugar debe usar -[NSBundle pathForResource:ofType:inDirectory:]. Así que el código debe ser similar en lugar

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

Ok, gracias. El uso de 'inDirectory' parece funcionar. Pero esto significa que el comportamiento ha cambiado (silenciosamente) ya que funciona en versiones posteriores, ¿verdad? –

+0

Parece que cambiaron el método para manejar las rutas completas dadas en el parámetro 'pathForResource:', pero incluso si solo soportas 4.0 y superior, es mejor usar la API correctamente y usar el parámetro 'inDirectory:' para todos los directorios . –

+0

Para el registro, es un marco que estoy usando que lo hace así. Es extraño que Apple haya cambiado este comportamiento sin previo aviso. –

10

A pesar de que esto ha sido contestada ya, me gustaría añadir que -[NSBundle pathForResource:ofType:inDirectory:] tiene diferentes entre mayúsculas y minúsculas según se trate de simulador de iPhone o simulador de iPad o dispositivo. Por ejemplo, iPhone Simulator 4.0 parece ser insensible a las mayúsculas y minúsculas, mientras que en iPad Simulator 3.2 y el dispositivo distingue entre mayúsculas y minúsculas. Por lo tanto, es posible que los archivos que se encuentran en el simulador de iPhone 4.0 no se encuentren en IPad Simulator 3.2 o en el dispositivo si los casos no coinciden.

+3

Gracias por la nota. Me acabo de quemar por la diferencia de sensibilidad a mayúsculas y minúsculas. –

Cuestiones relacionadas