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

Posted

技术标签:

【中文标题】MonoTouch <--> 静态库异常:无法在包中加载 NIB【英文标题】:MonoTouch <--> Static Library Exception : Could not load NIB in bundle 【发布时间】:2013-04-19 16:27:38 【问题描述】:

我有一个静态库,使用Xcode 4 开发,这个库包含一个自己的UIViewController。 现在我正在尝试从我的 MonoTouch 项目中使用此视图及其控制器。 但是在视图试图加载NIB文件的那一刻,我得到了以下异常:

"NSInternalInconsistencyException Reason: Could not load NIB in bundle".

有没有办法在 MonoTouch 项目中使用来自 Objective-C 静态库的现有 UIViewController

【问题讨论】:

【参考方案1】:

这并不是 MonoTouch 特有的问题,这是因为主包中不存在 nib 文件。 NIB 文件(以及与此相关的图像)未打包在库中,而是打包在资源包中。如果您在 .app 上“显示包内容”,您将在根目录或 en.lproj 中看到主应用程序中的所有文件。您将看不到库的 nib 文件,因为您的应用不知道如何构建它。

最快的解决方法是将 .xib 文件移动到 MonoTouch 主项目,它应该会立即工作,尽管这并不令人满意。另一种方法(我只在 XCode 中做过)是将捆绑目标添加到您的库项目中以保存您的资源。

创建包的步骤:

    在您的库项目中,使用 OS X -> Framework & Library -> Bundle 添加一个新目标。不要担心“OS X”部分。将其命名为“MyLibrary”。 您应该会在构建产品中看到“MyLibraryResources.bundle”。 在这个新目标中,将 .xib 文件添加到“复制捆绑资源”构建阶段。 将“MyLibraryResources.bundle”构建产品添加到应用的“Copy Bundle Resources”构建阶段。

现在,如果您构建应用程序,它仍然会崩溃,但如果您查看 .app 文件,您会看到包含您的 NIB 文件的目录“MyLibraryResources.bundle”。下一步是让您的视图控制器引用该 NIB。

找到您拨打的电话initWithNib:bundle:。是时候设置捆绑包了!以下步骤创建一个包:

NSBundle *myLibraryBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle]
    URLForResource:@"MyLibraryResources" withExtension:@"bundle"]];

如果你通过initWithNib:@"MyViewController" bundle:myLibraryBundle 它应该可以工作。您可能希望将 myLibraryBundle 打包为每次应用执行时只调用一次。

【讨论】:

以上是关于MonoTouch <--> 静态库异常:无法在包中加载 NIB的主要内容,如果未能解决你的问题,请参考以下文章

使用 AudioQueue 和 Monotouch 静态声音录制

MonoTouch 如何为带有静态单元格的 UITableViewController 实现 RowSelected

帮助在monotouch中绑定一个静态objective-c库

Monotouch:使用 iPhone 模拟器播放背景音频

无法在 monotouch 中使用本机库

MonoTouch - 如何有效地创建具有所有 CGColor 类型的列表