【问题标题】:'Could not load NIB in bundle' from iOS Static Framework来自 iOS 静态框架的“无法在包中加载 NIB”
【发布时间】:2015-04-21 14:57:14
【问题描述】:

我正在创建一个包含 xib 文件的静态 iOS 框架(Xcode 6 中的默认模板)。

但是,在将我的框架添加到另一个应用程序时,我无法加载 nib 文件,我收到以下错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </private/var/mobile/Containers/Bundle/Application/89B7C8F1-698A-4E0B-AD8F-4DB414A6001B/Sample.app> (loaded)' with name 'MyNibName''

我尝试了几种解决方案,其中一些概述了here。我仍然无法解决问题。

我看到很多对 this popular project 的引用,因为 xcode 具有内置功能,所以现在不受支持。我应该改用这个吗?

在我的框架目标中,我在“复制捆绑资源”构建阶段中包含了 xib 文件,并且我在构建的框架目录中看到它们,但是,我注意到生成的框架的结构不遵循中概述的结构apple's documentation。即使我更改了框架结构(使用版本并将HeaderResources 文件夹链接到当前版本)我仍然无法解决问题。

我尝试通过以下方式加载我的笔尖:

1通过框架名称加载包,在这种情况下包是nil

NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"myframework" ofType:@"framework"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];

2 创建资源包并将其添加到框架中。也是nil。请注意,如果我将捆绑包单独添加到项目中,则此解决方案有效,但这违背了框架的目的。

NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"resources" ofType:@"bundle"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];

3 按类加载捆绑包,仍然无法正常工作,但它返回与[NSBundle mainBundle] 中相同的应用捆绑包。 FrameworkClass 是嵌入在框架中的任何类。

NSBundle* bundle = [NSBundle bundleForClass:[FrameWorkClass class]];  

4 使用 [NSBundle mainBundle] 加载主包,这不起作用也不应该起作用。


我认为正在发生的事情是框架的资源没有包含在最终的应用程序中。

我错过了什么?有没有人能够使用 xcode 中的默认静态框架模板来制作带有 nib 文件的框架?

【问题讨论】:

  • 你能显示你用来加载笔尖的代码吗?
  • 您可以使用:NSBundle* bundle = [NSBundle bundleForClass:[YourFrameWorkClass class]];
  • 现在捆绑打印为零吗?还要检查你的框架并检查包和笔尖是否存在。
  • @MidhunMP 在这种情况下它不是零,它是应用程序包。这是我登录时得到的:&lt;/private/var/mobile/Containers/Bundle/Application/01AD75AF-125D-4B40-9757-B901AB6ECDC0/Sample.app&gt;
  • @KushalAshok 很抱歉刚刚注意到这一点的迟到的回复。我当时没有找到解决办法。

标签: ios xcode static-libraries xib ios-frameworks


【解决方案1】:

这应该会加载你的包。

斯威夫特

let frameworkBundleID  = "com.framework.bundleId";
let bundle = Bundle(identifier: frameworkBundleID)

目标 C

NSString* const frameworkBundleID  = @"com.framework.bundleId";
NSBundle* bundle = [NSBundle bundleWithIdentifier:frameworkBundleID];

【讨论】:

  • 完美而准确的答案,非常喜欢它
  • 这对我有用,但如果您嵌入在库中的 3rdparty 框架(静态库)正在搜索应该位于其部分根文件夹中的 nib 资源,则无法解决问题...
【解决方案2】:

这对我有用:

导入 loginFramework/ClassA.h

NSBundle* resourcesBundle = [NSBundle bundleForClass:[ClassA class]];
ClassA * class = [[ClassA alloc]initWithNibName:@"ClassA" bundle:resourcesBundle];
UINavigationController * navigation = [[UINavigationController alloc] initWithRootViewController:class];

[self.window setRootViewController:navigation];

在这种情况下在应用程序委托中,并在框架的标题中添加 #import "ClassA.h"

如果你愿意,我可以给你一个例子

【讨论】:

    【解决方案3】:

    SWIFT v5

    我在常量文件中创建了一个变量

    var frameworkBundle:Bundle? {
        let bundleId = "com.framework.bundleId"
        return Bundle(identifier: bundleId)
    }
    

    然后每当我需要捆绑价值时,我都会直接传递它

    collectionView.register(UINib(nibName: "MyCVCell", bundle: frameworkBundle), forCellWithReuseIdentifier: "MyCVCell")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2011-07-21
      • 2012-06-03
      相关资源
      最近更新 更多