2011-08-24 8 views
6

Digamos que tengo un iOS o Mac Framework que llamaremos Test.framework. Este marco se ha compilado y enlazado con éxito (se hizo un truco para lipo tanto i386 como archv6/7 archs para la parte de iOS) y está funcionando perfectamente bien.Agregue una imagen (u otros recursos) a un Marco de Mac o iOS

Ahora quiero agregarle una imagen, llámenos 'test.png'. He copiado en la carpeta Recursos de mi marco de modo que tenga la siguiente estructura:

ls Test.framework 

- Headers -> Versions/Current/Headers 
- Resources -> Versions/Current/Resources 
- Test -> Versions/Current/Test 
- Versions 

ls Test.framework/Resources 

- Info.plist 
- test.png 

Sin embargo, cuando se crea un proyecto utilizando mi marco no puedo acceder a esa imagen.

que he probado:

[UIImage imageNamed:@"test.png"] 
[UIImage imageNamed:@"Test.framework/test.png"] 
[UIImage imageNamed:@"Test.framework/Resources/test.png"] 

Pero nada resultó que siempre me devolvió un objeto nil.

¿Alguna idea?

EDITAR

Después de mucha investigación adicional parece lo que estoy tratando de lograr no se puede hacer en IOS. El motivo es que el paquete de aplicaciones final (el .app) no copia los marcos privados donde se compilarán las aplicaciones compiladas para Mac OS.

Esto se detalla más detalladamente en el iOS Bundle Structures documentation.

Gracias a Rob Keniger y xuzhe por su ayuda apreciada. Le daré crédito a xuzhe por la respuesta, ya que en realidad es la respuesta más adecuada para mi problema original (aunque Rob comentó que profundicé en el problema)

Respuesta

4

El método "imageNamed:" es solo para imágenes en su aplicación haz. Debe utilizar

[[UIImage alloc] initWithContentsOfFile:path]; 

en su lugar.

Acerca de la ruta, ya que no estoy seguro de si el "Test.Framework" está en su paquete de aplicaciones, no puedo darle un código de muestra. Pero si la dosis, el código de abajo debería funcionar:

NSString* path = [Nsstring stringWithFormat:@"%@/Test.framework/Resources/test.png", [[NSBundle mainBundle] bundlePath]]; 
+0

diciendo que "El método" imageNamed: "es solo para imágenes en su paquete de aplicaciones" no es del todo cierto. Si agrego un paquete (por ejemplo, test.bundle) a mi proyecto y este paquete tiene test.png en él, entonces [UIImage imageNamed: @ "test/test.png"] funcionará muy bien. – apouche

+0

sin embargo, su solución es interesante, pero no tengo el marco incluido en mi aplicación (puede instalarse en las carpetas de frameworks comunes) – apouche

+0

@apouche Si está agregando un paquete en su paquete de aplicaciones y luego llama '[UIImage imageNamed: @ "test.bundle/test.png"]; 'está bien porque el archivo test.bundle también está en el paquete principal. Si no es así, dudo que "imageNamed:" pueda encontrarlo. – xuzhe

3

que pueda obtener el paquete para una clase particular usando [NSBundle bundleForClass:[SomeClass class]]. Todo lo que necesita hacer es pasar una clase definida en el marco y tendrá una referencia al paquete del marco.

Luego, puede solicitar el paquete de la ruta de la imagen utilizando el método de pathForResource:ofType:NSBundle, y luego usar el método de initWithContentsOfFile:NSImage para crear su imagen.

Tenga en cuenta que nunca debe codificar las rutas. Nunca. Hay muchas funciones y métodos diferentes para obtener rutas a los recursos, nunca necesita codificarlos.

+1

esto es bastante inteligente, pero desafortunadamente no dio los resultados esperados. cuando hice '[NSBundle bundleForClass: [SomeClass class]]' me devolvió exactamente el mismo objeto que el paquete principal. El motivo es que todas las clases utilizadas en Test.framework se agregaron al proyecto final binario y no se "copiaron" en la ruta final de .app. Así que al final los recursos se omiten :( – apouche

+0

gracias por su ayuda, lo que quería lograr no se puede hacer en iOS, consulte mi edición si desea obtener más información – apouche

Cuestiones relacionadas