静态库上的 Xib 文件

Posted

技术标签:

【中文标题】静态库上的 Xib 文件【英文标题】:Xib file on static library 【发布时间】:2015-12-08 16:33:29 【问题描述】:

我正在接手一个我没有开始的项目,而且我还是一名大三学生,所以我需要一些帮助来澄清我的想法。 我正在为 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】:

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

所以.podspec 会这样写:

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

笔尖会这样加载:

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,这两个错误都将得到解决。

【讨论】:

我试过[[NSBundle bundleForClass: FeedbackController.class] loadNibNamed:@"CheckBoxWithText" owner:self options:nil];[[NSBundle bundleForClass: [FeedbackController class]] loadNibNamed:@"CheckBoxWithText" owner:self options:nil]; 但错误仍然存​​在 您是如何将.xib 文件添加到您的CocoaPod 中的?使用resources 或resource_bundles? 我不太确定,所以我两个都去了:s.resource = "ubForm/Images.xcassets/**/*.*" s.resource = "ubForm/**/*.xib" s.resource_bundles = "ubForm/**/*.xib" 存在多个问题。首先,您应该只使用其中一种方法,而不是同时使用两种方法。让我们选择resources。其次,您应该指定资产目录本身,而不是子目录。 s.resources = ['ubForm/Images.xcassets', 'ubForm/**/*.xib'] - 接下来是检查使用 Pod 的项目中的文件夹 Pods/CheckBoxWithText。在那里找到 Nib 文件并检查它的调用方式和位置。更改 podspec 后不要忘记先执行pod update 我已经按照你说的做了并更新了我的 podspec。查看暂存应用程序的 pod 文件夹,我可以看到包含所有图像的资源文件夹,但看不到任何 .xib 文件。为了确定,我尝试了各种指定资源文件夹的方法。如果我的 podspec 被忽略了,我也不应该拥有图像目录,所以我认为不是这样。

以上是关于静态库上的 Xib 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS的静态库中添加xib文件

无法从静态库和包中加载子视图类和 xib

CoCreateInstance 异常。在静态库上使用 REGSVR32 进行类注册?

IOS开发----生成静态库(.a)

创建.a静态库, framework静态库

如何在 xib 上设置静态 UITableview?