我们虽然已经将主骨架拆分了,但是毕竟我们TZSoundMain主骨架里面到底有什么方法,具体方法做什么事情,外界并不知道,如果不把主骨架里面所有的文件看一遍是不可能做到的,这样对其他使用我们私有库的人来说相当不方便,所以我们应该做一个中间层来统一披露我们的API,让外界来使用,而且我们没有在中间层披露的API,其实是不允许外界使用的,但是好处就是一目了然,其他人通过中间层很快就知道怎么去使用我们的私有库。
-
我们在这里画一张图来说明这个问题
这张图很好说明了这个问题,我们将私有库里面的内容通过中间层披露出公共的API,在此基础上外界使用的时候只需要调用中间层的API就可以直接和我们的私有库的内容进行交互,而不需要再苦苦的追寻所需要的内容,一目了然。
现在我们以我们的主骨架为例,将TZSoundMain里面的内容增加一个中间层用来披露我们提供给外界的API。
-
创建一个类MainModuleAPI
/**
获取根控制器
@return rootTabBarcontroller
*/
+ (UITabBarController *) rootTabBarController;
/**
添加子控制器
@param viewController 子控制器
@param normalImageName 普通状态下地图片
@param selectedImageName 选中状态下地图片
@param isRequired 是否需要包装导航控制器
*/
+ (void) addChildViewController: (UIViewController *) viewController normalImageName: (NSString *) normalImageName selectedImageName: (NSString *)selectedImageName isRequiredNavgationController: (BOOL) isRequired;
/**
设置tabbar中间控件的点击代码块
@param middleClickBlock 点击代码块
*/
+ (void) setTabbarMiddleButtonClick:(void(^)(BOOL isPlaying))middleClickBlock;
/**
设置全局导航栏标题背景图片
@param globalImage 全局导航栏背景图片
*/
+ (void) setNavigationBarGlobalBackGroundImage: (UIImage *) globalImage;
/**
设置全局导航栏标题颜色, 和文字大小
@param globalTextColor 全局导航栏标题颜色
@param fontSize 全局导航栏文字大小
*/
+ (void) setNavigationBarGlobalTextColor: (UIColor *)globalTextColor andFontSize: (CGFloat) fontSize;
+ (UITabBarController *)rootTabBarController
{
return [TZTabBarController shareInstance];
}
+ (void)addChildViewController:(UIViewController *)viewController normalImageName:(NSString *)normalImageName selectedImageName:(NSString *)selectedImageName isRequiredNavgationController:(BOOL)isRequired
{
[[TZTabBarController shareInstance] addChildVC:viewController normalImageName:normalImageName selectedImageName:selectedImageName isRequiredNavController:isRequired];
}
+ (void)setTabbarMiddleButtonClick:(void (^)(BOOL))middleClickBlock
{
TZTabBar *tabbar = (TZTabBar *)[TZTabBarController shareInstance].tabBar;
tabbar.middleClickBlock = middleClickBlock;
}
+ (void)setNavigationBarGlobalBackGroundImage:(UIImage *)globalImage
{
[TZNavBar setGlobalBackGroundImage:globalImage];
}
+ (void)setNavigationBarGlobalTextColor:(UIColor *)globalTextColor andFontSize:(CGFloat)fontSize
{
[TZNavBar setGlobalTextColor:globalTextColor andFontSize:fontSize];
}
其实我们注意观察一下可以发现,我们只不过是对之前自定义的tabbarController,tabbar,navbar这些类的方法做了二次封装,然后根据需要对外界暴露了我们想要公开的API,这样做的好处是,不需要再向外界交代太多信息,只需要让外界和我们的中间层交互就可以使用我们的私有库里面的内容。
- 那么按照我们对私有库升级的步骤来操作就可以了,首先修改spec文件的版本号,然后提交代码到我们的远程代码仓库,并且打上tag值
- 我们校验的时候发现还是和之前一样提示我们找不到Category库,但是不必在意直接提交就可以了,毕竟此时的确找不到私有库
-
上传.spec文件到本地索引库,接着会自动将.spec文件推送到远程索引库
-
紧接自然是进入到宿主工程中重新安装我们的TZSoundMain私有库,记得要将podfile.lock文件删除掉
我们看看宿主工程中有没有将我们的披露API的中间层安装进来
- 接下来我们要将appdelegate之前使用加载主骨架的代码全部重构
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UITabBarController *rootVC = [MainModuleAPI rootTabBarController];
[MainModuleAPI addChildViewController:[TestVC new] normalImageName:@"tabbar_find_n" selectedImageName:@"tabbar_find_h" isRequiredNavgationController:YES];
[MainModuleAPI addChildViewController:[UIViewController new] normalImageName:@"tabbar_sound_n" selectedImageName:@"tabbar_sound_h" isRequiredNavgationController:YES];
[MainModuleAPI addChildViewController:[UIViewController new] normalImageName:@"tabbar_download_n" selectedImageName:@"tabbar_download_h" isRequiredNavgationController:YES];
[MainModuleAPI addChildViewController:[UIViewController new] normalImageName:@"tabbar_me_n" selectedImageName:@"tabbar_me_h" isRequiredNavgationController:YES];
[MainModuleAPI setTabbarMiddleButtonClick:^(BOOL isPlaying) {
if (isPlaying) {
NSLog(@"播放");
}else {
NSLog(@"暂停");
}
}];
self.window.rootViewController = rootVC;
[self.window makeKeyAndVisible];
return YES;
}
- 那么最后我们看看效果是不是和之前宿主工程一般无二
那么组件化披露API就讲完了,到目前为止组件化的基础就全部讲完了,接下来就真正的带着大家一点点来完善整个项目了。