"无法在iOS静态框架中加载NIB"

KDa*_*ker 11 xcode static-libraries xib ios ios-frameworks

我正在创建一个包含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''
Run Code Online (Sandbox Code Playgroud)

我尝试了几种解决方案,其中一些在此概述.我仍然无法解决这个问题.

我看到很多对这个流行项目的引用现在都不受支持,因为xcode具有内置功能.我应该使用它吗?

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

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

1按框架名称加载bundle,nil在这种情况下是bundle

NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"myframework" ofType:@"framework"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];
Run Code Online (Sandbox Code Playgroud)

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

NSString *resourceBundlePath = [[NSBundle mainBundle] pathForResource:@"resources" ofType:@"bundle"];
resourcesBundle = [NSBundle bundleWithPath:resourceBundlePath];
self = [super initWithNibName:@"MyNibName" bundle:resourcesBundle];
Run Code Online (Sandbox Code Playgroud)

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

NSBundle* bundle = [NSBundle bundleForClass:[FrameWorkClass class]];  
Run Code Online (Sandbox Code Playgroud)

4加载主包[NSBundle mainBundle]不使用也不应该工作.


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

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

Sri*_*nth 19

这应该加载你的包.

NSString* const frameworkBundleID  = @"com.framework.bundleId";
NSBundle* bundle = [NSBundle bundleWithIdentifier:frameworkBundleID];
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但如果您嵌入库中的第三方框架(静态库)正在搜索应该位于其部分的根文件夹中的`nib`资源,则无法解决问题... (2认同)

Lor*_*nzo 4

这对我有用:

导入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];
Run Code Online (Sandbox Code Playgroud)

在本例中,在应用程序委托中,并在框架的标头中添加#import“ClassA.h”

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