你能从iPhone上的静态库引用Xib文件吗?

在我的应用程序中,我目前已将所有代码分离到一个静态库中,以便更容易地为实际应用程序和unit testing设置我的代码的xcode项目目标。 这个问题是我想我的大部分我的xib文件在静态库中,但似乎是当我运行我的应用程序,并尝试引用xib它找不到它,除非它包含在实际应用程序的目标,而不是静态库目标。 是否有可能在同一个库中的代码引用的静态库中包含xib文件和其他资源,如果是这样,如何?

不,这是不可能的,因为一个静态库不是一个“捆绑”。

bundle是一个可以包含所有文件的目录,包括资源文件(xib),可执行文件和静态库。 它作为一组单个文件存在于文件系统中。

静态库是一个单独的文件,包含由库创build者链接在一起的类,代码和variables。 它不包含其他文件,它本质上是编译代码的数据库。

虽然可以将xib的数据放在那里,但Xcode无法知道它在那里,因为它将它们视为文件系统上的单个文件。

在Mac OS中,您可以创build一个“框架”,这本质上是一堆代码,资源,设置等,可以被多个项目重复使用。 但是,苹果似乎不支持iPhone OS的自定义框架创build。

软件包http://developer.apple.com/iphone/library/documentation/CoreFoundation/Conceptual/CFBundles/CFBundles.html

静态库http://en.wikipedia.org/wiki/Static_library

回复评论(不适合在评论框中)

不用担心,上周我一直在做和你一样的工作 – 我想把一个xibs,include文件和.a库的“框架”发给客户端,而不是给他们所有的源码码。 我无法find一个很好的方式来捆绑。

无论出于什么原因,苹果对此都特别呆板 – 我不认为在静态库(dynamic库足够公平)的情况下它们是如此的理由。

我现在的解决scheme是手动创build包含以下子文件夹的包文件夹“Foo”:

  1. “include” – >把.h文件放在这里
  2. “res” – >把.xib文件放在这里
  3. “lib” – >包含“iphoneos”和“iphonesimulator”子文件夹,每个文件夹都带有libFoo.a

然后将其压缩并发送给客户。 客户然后:

  1. 将包裹解压到任何他们喜欢的地方。
  2. 添加资源组下的“res”文件夹。
  3. 更改以下目标设置:
    其他链接器标志= -Objc -lfoo
    标题searchpath= / include
    图书馆searchpath= / lib / $(PLATFORM_NAME)

我可能会自动完成包的创build,但是我的客户端却被困在了四个微小的步骤中。

我find了一个完美的解决scheme,做到了上述所有自动和更多https://github.com/kstenerud/iOS-Universal-Framework它是一个xCode插件;

它对我来说就像一个魅力,它只适用于XCode 4及以上

是的你可以。 像在任何普通项目中一样,在库中添加一个xib文件。 然后在库项目目标中添加复制文件部分中的xib文件以及.a文件。 在您使用该库的主项目中,拖放库的.a文件所在的xib文件。

分发时,你也可以创build一个SDK。 JSON.framework在他们的SVN中做了这个,我成功地复制了这个。 您可以在hltypes-ios.xcodeproj和项目中的iOS文件夹中的http://hltypes.svn.sf.net/中看到这是如何完成的。;

主要你需要“安装”到你的生成文件夹,然后你需要复制特殊格式的SDKSettings.plist。 然后将SDK的path添加到应用程序项目的“其他SDK”列表中。 复合SDK的缺点是需要重新启动Xcode 3.x,无论何时更新这个mini-SDK,Xcode坚持构build一个由Apple的基础SDK和你的mini-SDK创build的复合SDK(这意味着你需要等待一段时间) 。

应用程序项目仍然需要手动添加.xib和其他资源。