最近研究组件化、看了不少的资料,遇到很多坑,这里记录一下方便小伙伴参考。不会和大神一样我会用最朴实简单的语言表达,希望认识更多的朋友、我心愿世界和平
组件化个人感觉组件化维护成本较高、主要是为了解耦,但是有利必有弊
一、同一个工程下组件化实现思路,主要用中间件CTMediator(把它理解成沟通的桥梁,比如很多控制器之间跳转是直接push的,那么用到中间件CTMediator 就是通过CTMediator push的)
两个控制器的跳转实现:
1.项目导入CTMediator 文件,当然也可以pod导入 pod 'CTMediator'
2.写跳转目标文件:目的就是写一个跳转到目标控制器的方法 准备提供给3步骤中CTMediator+CTMediatorManager类中的方法参数
注意:Target_TotalTargetVC对象名称Target_前缀是固定的,
Action_nativeDetailMainViewController方法名前缀Action_是固定的,参照CTMediator代码可见原因
Target_TotalTargetVC.h代码
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface Target_TotalTargetVC : NSObject - (UIViewController *)Action_nativeDetailMainViewController:(NSDictionary *)params; @end NS_ASSUME_NONNULL_END
Target_TotalTargetVC.m
#import "Target_TotalTargetVC.h" #import "MainViewController.h" @implementation Target_TotalTargetVC - (UIViewController *)Action_nativeDetailMainViewController:(NSDictionary *)params { MainViewController *VC = [[MainViewController alloc]init]; VC.dic = params; return VC; } @end
3.写CTMediator分类CTMediator+CTMediatorManager
此分类目的:通过调用中间件CTMediator中的方法 ,方法中的参数来源于Target_TotalTargetVC对象,结果返回跳转的控制器UIViewController
CTMediator+CTMediatorManager.h
#import "CTMediator.h" NS_ASSUME_NONNULL_BEGIN @interface CTMediator (CTMediatorManager) - (UIViewController *)CTMediator_viewMainViewController:(NSDictionary*)params; @end NS_ASSUME_NONNULL_END
CTMediator+CTMediatorManager.m
#import "CTMediator+CTMediatorManager.h" // 这里指的是Target_TotalTargetVC.h对象 NSString * const kCTMediatorTotalTargetObject = @"TotalTargetVC"; // 这指的是Target_TotalTargetVC.m中 Action_nativeDetailMainViewControllerf 方法 NSString * const kCTMediatorActionNativeDetailMainViewController = @"nativeDetailMainViewController"; @implementation CTMediator (CTMediatorManager) - (UIViewController *)CTMediator_viewMainViewController:(NSDictionary*)params { //由于CTMediator_viewMainViewController是CTMediator的扩展,所以可以直接使用CTMediator的方法 UIViewController *viewController = [self performTarget:kCTMediatorTotalTargetObject action:kCTMediatorActionNativeDetailMainViewController params:params]; if ([viewController isKindOfClass:[UIViewController class]]) { return viewController; } else { // 这里处理异常场景,具体如何处理取决于产品 return [[UIViewController alloc] init]; } } @end
4.最后一步,在你需要跳转的地方这样写就可以了
#pragma mark - 跳转 - (void)toMainViewController:(BOOL)isAnimate{ UIViewController *VC = [[CTMediator sharedInstance]CTMediator_viewMainViewController:@{@"key":@"CTMetor传值你好"}]; [self.navigationController pushViewController:VC animated:isAnimate]; }
这里只写同一个工程中的中间件,下一篇文章介绍 不同项目工程间的跳转。