从我自己的包中加载笔尖?

Posted

技术标签:

【中文标题】从我自己的包中加载笔尖?【英文标题】:Loading nib from my own bundle? 【发布时间】:2012-12-11 17:38:18 【问题描述】:

我正在尝试将 NIB/XIB 文件放在我称为 Configuration.bundle 的包中。当我尝试从我的包中加载 xib 时,应用程序崩溃,因为它找不到 xib 文件。

NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle]
pathForResource:@"Configuration" ofType:@"bundle"]];
[bundle load];
NSLog(@"bundle: %@", bundle);

我得到了输出

bundle: NSBundle(尚未加载)

“尚未加载”部分让我有点害怕。为什么没有加载?

最后,当我尝试使用视图控制器加载我的笔尖时

ConfigViewController *configViewController = [[ConfigViewController alloc] initWithNibName:@"ConfigViewController" bundle:bundle];

我得到了输出

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在包中加载 NIB:“NSBundle(尚未加载)”,名称为“ConfigViewController.xib”

我尝试过使用和不使用 .xib。

有什么想法吗?

【问题讨论】:

【参考方案1】:

load 方法用于加载可执行代码,例如框架之类的东西。 您的捆绑包不包含您要加载的任何可执行文件,因此您无需调用 [bundle load]。 如果包的名称是正确的,那么除了 [bundle load] 之外,您编写的所有内容都可以。无论如何检查路径是否正确,不要嵌套太多说明:

NSString* path=[ [NSBundle mainBundle] pathForResource: @"Configuration" ofType: @"bundle"];

如果这个字符串是正确的路径,那么你肯定会在不调用 [bundle load] 的情况下正确加载包。

【讨论】:

感谢您的评论,但不能解决我的问题。它仍然不会加载笔尖:( 此时是bundle名称错误,或者它不在主bundle中。你复制了吗? 如果我在加载包时拼错了包名,NSBundle 将为 nil。所以它肯定会加载一些东西 你在项目中正确复制了吗? 是的,我可以在我的项目中看到 Bundle 和其中的 xib 文件【参考方案2】:

首先,如果包没有正确创建,它将不会被加载。因此,为了创建正确的捆绑包,以下是创建捆绑包的步骤: 1. 通过在 OS X -> Framework & Libraries 下选择一个名为 bundle 的模板来添加一个新目标。

    选择新创建的目标并将 BaseSDK 从 OSX 更改为最新的 ios

    在 Build Phrases -> Copy Bundle Resources 中添加您想要使用的 .xibs、图像或其他资源。

    在 Build Phrases 中添加 CoreFoundation 框架 -> 将二进制文件与库链接。

    选择iOS设备编译目标。

    将新创建的捆绑包从 Products 目录保存到某个位置。

现在将该捆绑包复制到您的主项目中。使用以下代码加载包:

NSString *path = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:path];"

您现在已设置好新的捆绑包。

【讨论】:

以上是关于从我自己的包中加载笔尖?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个包加载资源

无法将 xib 文件存储到自己的包中

如何在 ios 和 android 中加载自己的地图服务

MonoTouch <--> 静态库异常:无法在包中加载 NIB

无法访问 iframe 中加载的自己域上的 httponly 标记 cookie

使用 Python (PyQT 5.10) 在 QT 5.10 中加载自己的字体