静态库上的Xib文件

时间:2015-12-08 16:33:29

标签: ios objective-c xcode static-libraries xib

我正在接手一个我没有开始的项目,我还是一名大三学生,所以我需要一些帮助来澄清我的想法。 我正在为iOS 7.0及更高版本开发一个库。 然后通过cocoapods分发该库。

我已经构建了一个自定义视图以及我如何使用包含它的.xib文件。 它在我的开发应用程序中完美运行(因为我直接使用代码),但是当我在我的暂存应用程序(通过本地pod加载库)中测试它时,我得到了

NSInternalInconsistencyException Could not load NIB in bundle: 'NSBundle </Users/Jack/Library/Developer/CoreSimulator/Devices/899B54FC-8A37-4182-9D89-109251B58555/data/Containers/Bundle/Application/36A3B225-AEF2-42B7-8AEC-5D930F4C4BCA/StagingApp.app> (loaded)' with name 'CheckBoxWithText''

.xib文件位于复制文件构建阶段,是我用来构建库的目标的一部分。

我正在加载像这样的xib

[[NSBundle mainBundle] loadNibNamed:@"CheckBoxWithText" owner:self options:nil];

但是一旦组件加载到屏幕上,它就会崩溃 有些人说要使用你的图书馆的捆绑,但我不认为我的图书馆有一个标识符(在信息上看不到它)。
我尝试使用

[[NSBundle bundleWithIdentifier:@"com.company.project"] loadNibNamed:@"CheckBoxWithText" owner:self options:nil];

但它没有加载任何东西。

我花了整个下午阅读可能的解决方案,但现在我的脑子里有很多困惑。

一个静态库(比如我的)不应该包含像xib这样的资源,但是我用它来打包一些图像。我在这里遗漏了什么吗? 我已经阅读了tutorial关于一个使用budle目标达到此目的的人,但我还没有真正理解他是如何做到这一点的,并且我将如何使用该目标,因为我应该使用我的聚合目标建立图书馆。

如果不能在iOS7.0上使用它,动态框架可以解决问题。

我是以编程方式构建布局的唯一选择吗? 或者我只是遗漏了一些东西而且可以打包.xib文件?

1 个答案:

答案 0 :(得分:0)

当您使用.xib中的resources指定文件时,CocoaPods似乎没有获取.podspec个文件。使用resource_bundles可以正常工作。

所以.podspec会读到:

s.resource_bundles = { 'CheckBoxWithText' => ['CheckBoxWithText.xib'] }

Nib会像这样加载:

NSBundle* bundle = [NSBundle bundleForURL:[NSBundle.mainBundle URLForResource:@"CheckBoxWithText"
        withExtension:@"bundle"]];
NSArray* nib = [bundle loadNibNamed:@"USACheckBoxWithText" owner:self options:nil];

现在还有另一个bug in CocoaPods which prevents asset catalogs to be loaded from resource_bundles。您现在应该避免使用资产目录。

请注意,如果您最少使用iOS 8并在Swift中开发Pod,则会解决这两个错误。