我正在创建一个包含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。即使我更改了框架结构(使用版本并将Header
和Resources
文件夹链接到当前版本),我仍然无法解决问题。
我尝试通过以下方式加载我的笔尖:
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文件的框架?
答案 0 :(得分:18)
这应该加载你的包。
NSString* const frameworkBundleID = @"com.framework.bundleId";
NSBundle* bundle = [NSBundle bundleWithIdentifier:frameworkBundleID];
答案 1 :(得分: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];
在这种情况下,在app委托中,并在Framework的标题中添加 #import“ClassA.h”
如果你愿意,我可以给你一个例子
答案 2 :(得分:0)
SWIFT v5
我在常量文件中创建了一个变量
choice /?
然后,每当我需要捆绑价值时,我都会像这样直接传递
var frameworkBundle:Bundle? {
let bundleId = "com.framework.bundleId"
return Bundle(identifier: bundleId)
}