如果framwork中需要包含xib文件,则可以通过如下几种方式:
一、如果是打包静态framwork
如果Mach-o Type(见 https://www.jianshu.com/p/3f9bbb3959b5)选择的是Static Library静态库,即我们创建的是静态framwork,则有如下两种方式:
1.xib直接放到framework工程
iOS8开始,framwork可以直接放资源文件,所以我们可以把xib文件跟源码文件放在一起,然后编译生成framwork
如果framework中其他文件需要用到framwork中的xib,比如:
此framework中的NewViewController
使用到了ZMJView.xib

引用xib如下:
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *path = [bundle pathForResource:@"ZMJTestFramework" ofType:@"framework"];
NSBundle *SDKBundle = [NSBundle bundleWithPath:path];
ZMJView *view = [SDKBundle loadNibNamed: @"ZMJView" owner: nil options: nil].firstObject;
[self.view addSubview: view];
然后编译 生成framework,把framework拖入到目标工程,
Build Phases - Copy Bundle Resources增加framework
即可正常显示xib文件
2.xib放到bundle中
上面是直接把xib文件放到framework中,也可以把xib文件放到bundle文件中,然后编译生成framework后,跟图片一样把framework和bundle同时拉入到目标工程中。
xib放到bundle中引用如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"FrameworkUseBundle" ofType:@"bundle"];
NSBundle *SDKBundle = [NSBundle bundleWithPath:path];
FrameworkUseBundleVC *fw = [[FrameworkUseBundleVC alloc] initWithNibName:@"FrameworkUseBundleVC" bundle:SDKBundle];
[self presentViewController:fw animated:YES completion:nil];
二、如果是打包动态framwork
如果Mach-o Type选择的是Dynamic Library动态库,即我们创建的是动态framwork:
直接把xib文件放入到framwork工程中即可,然后编译生成framework,把framework放入到目标工程中
目标工程General - Embedded Binaries中增加framework
代码使用:
//加载方式1
NSBundle *SDKBundle = [NSBundle bundleForClass:[NewViewController class]];
//加载方式2 bundleWithIdentifier是Framework的BundleIdentifier
NSBundle *SDKBundle = [NSBundle bundleWithIdentifier:@"com.wecan.Framework-Xib"];
NewViewController *vc = [[NewViewController alloc] initWithNibName:@"NewViewController" bundle:SDKBundle];
[self presentViewController: vc animated:YES completion:nil];
网友评论