2009-04-01 18 views
30

En mi aplicación, actualmente tengo todo mi código separado en una biblioteca estática, para facilitar la configuración de los objetivos del proyecto xcode para la aplicación real y para las pruebas unitarias de mi código. El problema con esto es que quiero poner también la mayoría de mis archivos xib en la biblioteca estática, pero parece que cuando ejecuto mi aplicación e intento hacer referencia al xib, no puedo encontrarlo a menos que esté incluido en el archivo real. objetivo de la aplicación en lugar del objetivo de la biblioteca estática. ¿Es posible tener archivos xib y otros recursos incluidos en las bibliotecas estáticas a los que se puede hacer referencia mediante código en esa misma biblioteca y, de ser así, cómo?¿Puede hacer referencia a archivos Xib desde bibliotecas estáticas en el iPhone?

Respuesta

37

No, no es posible, porque una biblioteca estática no es lo mismo que un "paquete".

Un paquete es un directorio que puede contener todo tipo de archivos, incluidos los archivos de recursos (xib), archivos ejecutables y bibliotecas estáticas. Existe en el sistema de archivos como un grupo de archivos individuales.

Una biblioteca estática es un único archivo que contiene las clases, el código y las variables que el creador de la biblioteca ha vinculado entre sí. No "contiene" otros archivos, es esencialmente una base de datos de código compilado.

Aunque sería posible poner los datos para los xibs allí, Xcode no tendría forma de saber que estaba allí, ya que los busca como archivos individuales en el sistema de archivos.

En Mac OS, puede crear un "Framework" que es esencialmente un paquete de código, recursos, configuraciones, etc. que pueden ser reutilizados por múltiples proyectos. Sin embargo, Apple no parece ser compatible con la creación de marcos personalizados para iPhone OS.

Bundles http://developer.apple.com/iphone/library/documentation/CoreFoundation/Conceptual/CFBundles/CFBundles.html

bibliotecas estáticas http://en.wikipedia.org/wiki/Static_library

+0

Gracias por los enlaces. ¿Sería posible organizar mis xibs en su propio paquete y hacer que mi código de biblioteca dependa de eso? (Lo siento si la respuesta está en ese documento de Apple que proporcionó; no tengo mucho tiempo para leerlo en este momento). – Kevlar

+2

Acabo de encontrar esto, puede ser de utilidad: http://landonf.bikemonkey.org/code/ iphone/iPhone_Framework_Support.20081202.html – Justicle

+1

A menos que los Xcode Wizards (o lo que sea que los llamemos en OSX) sean incorrectos, tampoco hay un "paquete" en iOS, dejándome en un estado marginalmente suicida. –

14

Responder al comentario (no cabrá en la caja de comentario)

No se preocupe, yo he estado tratando de hacer más o menos lo mismo como usted durante la última semana, me gustaría enviar un "marco" de xibs, incluir archivos y .a libs a un cliente sin darles todo el código fuente. No pude encontrar una buena manera de hacer esto con los paquetes tampoco.

Por alguna razón, Apple es particularmente obtuso con esto, no veo una razón para que lo sean en el caso de las bibliotecas estáticas (las bibliotecas dinámicas son suficientes).

Mi solución por ahora es crear manualmente una carpeta del paquete de "Foo", que contiene las siguientes subcarpetas:

  1. "incluir" -> poner .h archivos aquí
  2. "res" -> puestas. archivos xib aquí
  3. "lib" -> contiene & subcarpetas "iPhoneOS" "" iphonesimulator cada uno con libfoo.a

Entonces zip esto y envían al cliente. El cliente entonces:

  1. Descomprime el paquete cuando lo desee.
  2. Agrega la carpeta "res" al grupo de recursos.
  3. Cambia los ajustes siguientes objetivos:
    Otras banderas Linker = -ObjC -lfoo
    de cabecera de rutas de búsqueda =/
    incluir Biblioteca de rutas de búsqueda =/lib/$ (PLATFORM_NAME)

es probable que pueda automatizo la creación del paquete con algunos pasos de compilación en mi extremo, pero el cliente tiene cuatro pasos poco complicados para configurarlo.

+0

¿Puede explicar qué hace el marcador -lfoo linker? No estoy seguro de cómo el compilador procesa esto. ¡Gracias! – jpswain

+2

'-lfoo 'es solo la bandera del enlazador para" enlace a la biblioteca foo'. Consulte http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html. Envíe por favor si ha encontrado útil esta respuesta. – Justicle

+0

Ok , por lo tanto, es solo por convención? Por ejemplo, si mi lib está en el paquete "Thingy", y mi archivo de salida es "libThingy.a", entonces mi bandera linker sería "-lthingy"? ¿Es correcto? También tiene "- Objc "- ¿no se supone que es" -ObjC "? Gracias! +1 – jpswain

0

Al distribuir también puede crear un SDK. JSON.framework hizo esto en su SVN, y lo repliqué con éxito. Puede ver cómo se hizo esto en http://hltypes.svn.sf.net/ en hltypes-ios.xcodeproj y en la carpeta de iOS en el proyecto.

Principalmente debe "instalar" en su carpeta de compilación, y luego debe copiar el SDKSettings.plist especialmente formateado. A continuación, agregue la ruta al SDK en la lista "SDK adicionales" en el proyecto de la aplicación. La desventaja de los SDK compuestos es la necesidad de reiniciar Xcode 3.x siempre que se actualice este mini-SDK, y la insistencia de Xcode en construir un SDK compuesto creado a partir del SDK base de Apple y su mini-SDK (lo que significa que necesita esperar bastante) .

El proyecto de la aplicación aún necesita tener .xib y otros recursos agregados manualmente.

2

Sí, puedes. agregue un archivo xib en su biblioteca como lo haría con cualquier proyecto normal. Luego, en el objetivo del proyecto de la biblioteca, agregue el archivo xib en la sección Copiar archivos junto con el archivo .a. En su proyecto principal en el que está utilizando la biblioteca, arrastre y suelte el archivo xib donde se encuentra el archivo .a para la biblioteca.

+1

Estás el único que está apoyando eso. Se puede hacer. Intenté con toda la solución, pero a mí no me funciona para nada. Y solo porque tienes la suficiente confianza, estoy tratando de hacerlo con más fuerza. ¿Puedes ayudarme con el pasos. Estoy cansado de experimentar. –

+1

Estoy secundando la solicitud de @ Rudeboy. ¿Lo intentaste realmente o simplemente estás asumiendo que debería funcionar? – Drux

Cuestiones relacionadas