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

时间:2013-04-19 16:27:38

标签: ios objective-c xcode xamarin.ios

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

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

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

1 个答案:

答案 0 :(得分:4)

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

最快的解决方法是将.xib文件移动到MonoTouch主项目中,它应该可以立即工作,尽管这并不令人满意。另一种方法,我只在XCode中完成此操作,就是将一个包目标添加到您的库项目中以保存您的资源。

创建捆绑包的步骤:

  1. 在您的图书馆项目中,使用 OS X - >添加新目标框架&图书馆 - >束即可。不要担心“OS X”部分。将其命名为“MyLibrary”。
  2. 您应该会看到“MyLibraryResources.bundle”出现在构建产品中。
  3. 在这个新目标中,将.xib文件添加到“Copy Bundle Resources”构建阶段。
  4. 将“MyLibraryResources.bundle”构建产品添加到应用的“复制捆绑资源”构建阶段。
  5. 现在,如果您构建应用程序,它仍然会崩溃,但如果您查看.app文件,您将看到带有NIB文件的目录“MyLibraryResources.bundle”。下一步是让您的视图控制器引用NIB。

    找到您正在呼叫initWithNib:bundle:的位置。是时候设置捆绑了!以下步骤创建一个包:

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

    如果你通过initWithNib:@"MyViewController" bundle:myLibraryBundle它应该有效。您可能希望以每次应用执行只调用一次的方式打包myLibraryBundle