2009-11-01 7 views
18

He creado una biblioteca estática en Xcode, que puedo usar con éxito en otros proyectos. Sin embargo, con recursos como listas de distribución, encuentro que debo incluir cualquier lista a la que se haga referencia en mi biblioteca en el proyecto principal donde se usa el proyecto.NSBundle, plist y otros recursos en Obj-c Static Library

En mi proyecto de biblioteca estática, tengo mi plist incluido en la fase "Copy Bundle Resources" del objetivo. En mi código, esto es lo que estoy haciendo:

NSBundle *mainBundle = [NSBundle mainBundle]; 
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"]; 

NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

Si uso mainBundle y la MyClassParams.plist está incluido en el proyecto principal, todo es bueno. Si MyClassParams.plist se incluye en el proyecto de la biblioteca, no funciona.

En el supuesto de que [NSBundle mainBundle] hacía referencia al método estático incorrecto utilizar, lo sustituyó con:

NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]]; 

Esto no funcionó bien.

Entonces, ¿es posible incluir un plist o cualquier otro recurso con una biblioteca estática, o tengo que incluir todo lo que necesito en el proyecto donde se usa lib?

+0

Comenzando una recompensa con la pregunta: ¿la respuesta aceptada sigue siendo correcta a partir de iOS 4.2? –

Respuesta

17

Las bibliotecas estáticas no están en paquetes, cuando se vinculan a una aplicación, forman parte de ese paquete de aplicaciones. En el iPhone, efectivamente, todo el código que escriba estará en MainBundle ya que no puede incluir marcos incrustados.

Así que sí, necesita copiar todos los recursos en el proyecto al que está vinculando el marco estático.

+0

Gracias por la respuesta. – Vickram

12

Sé que no puede incluir archivos de recursos en una biblioteca estática (eso es lo que hacen los marcos). utilizo otra solución en mis proyectos:

Dentro de la librería del proyecto estática "YYY":

  • agrego un objetivo "cargable Bundle" para mi proyecto de biblioteca estática (Agregar destino, cacao, cargable Bundle)
  • agrego este objetivo como una dependencia del objetivo biblioteca estática

Dentro del proyecto principal:

  • vincular el libYYY.a
  • Añadir el paquete YYY.bundle a los archivos de recursos copiados

De esta manera, los archivos de recursos usados ​​en la biblioteca estática no se gestionan en el proyecto principal.Decir que tengo una imagen foo.png en la biblioteca estática, utilizo

[UIImage imageNamed:@"YYY.bundle/foo.png"] 

A continuación, podría obtener su plist como esto:

NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]]; 
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"]; 

NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 

A continuación, dos capturas de pantalla:

  • left: proyecto de biblioteca estática con paquete cargado objetivo
  • right: muestra el binario de la biblioteca estática agregado a "Enlace binario con bibliotecas" y el paquete de recursos agregado a "Copiar paquetes de recursos".

Static library project Main project

+0

hola jilouc. .yo estoy atrapado con el último paso. . ¿Qué es archivos de recursos copiados? . por favor explique – thndrkiss

+1

@thndrkiss Simplemente arrastre y suelte el archivo del paquete en sus Recursos (como lo haría con cualquier otro archivo de recursos) y agréguelo al objetivo de su proyecto. He agregado una captura de pantalla. – Jilouc

+0

gracias amigo. .funcionó ! . . – thndrkiss

2

me siguieron todo @Jilouc sugiere, sin embargo, puedo conseguir el paquete pero no lograron obtener los archivos en su interior. Probé las dos formas (@"yyy.bundle/image" o staticlib pathforresource...)

¡Luego usé el siguiente método y funcionó!

NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]]; 

NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName]; 

NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];