/YFMediator

iOS Mediator —— iOS 组件化时代

Primary LanguageObjective-CMIT LicenseMIT

YFMediator

License   Support   CI Status   Pod

iOS 组件化的时代到临

YFMediator iOS 组件化中间件,新时代的解耦神器 !

强烈建议配合 YFRouter 使用 !!

Usage

YFMediator 封装页面常用的跳转方法,基于 UINavigationController

设置 NavigationController

/**
 注册一个 NavigationController 基类
 Mediator 创建的所有 NavigationController 都是这个类的实例

 @param navigationClass navigationController
 */
- (void)registerNavigationController:(Class)navigationClass;

页面跳转

2016121772911PushOrPop.gif

Push

/**
 Push 一个 ViewController
 会通过 className 或者 短链 创建 ViewController
 
 @param viewController viewController(className | URL)
 @return viewController
 */
- (UIViewController *)push:(NSString *)viewController;
- (UIViewController *)push:(NSString *)viewController animate:(BOOL)animate;
- (UIViewController *)push:(NSString *)viewController animate:(BOOL)animate params:(NSDictionary *)params;

Pop Dismiss

不管你的 ViewController 是通过 push 或者 present 的方式弹出,调用 pop 都可以返回,优先处理 pop,如果当前 ViewController 已经不能 pop 了,则判断能否 dismiss

/**
 Pop or Dismiss

 @return viewController
 */
- (UIViewController *)pop;
- (UIViewController *)popAnimate:(BOOL)animate;
- (UIViewController *)popToRoot;
- (UIViewController *)popToRootAnimate:(BOOL)animate;
- (UIViewController *)popTo:(NSString *)viewController;
- (UIViewController *)popTo:(NSString *)viewController animate:(BOOL)animate;

Present

/**
 Present 一个 ViewController
 会通过 className 或者 短链 创建 ViewController
 Present 操作默认会创建一个 NavigationController 来管理需要 Present 的 ViewController
 
 @param viewController viewController(className | URL)
 @return viewController
 */
- (UIViewController *)present:(NSString *)viewController;
- (UIViewController *)present:(NSString *)viewController animate:(BOOL)animate;
- (UIViewController *)present:(NSString *)viewController animate:(BOOL)animate params:(NSDictionary *)params;

201612179754params.gif

参数传递

使用 YFRouter 每个 ViewController 都会默认添加一个属性 params,在创建 ViewController 之后会把参数存在这个属性中

@property (nonatomic, strong) NSDictionary *params;

如果你传递的参数是 ViewController 中的一个属性,那么 YFMediator 会自动帮你赋值,赋值的方式是调用属性的 set 方法。

  • 注意:如果你是自定义创建的 ViewController,那么 YFMediator 将不会给它赋值,具体见下文
@interface ViewController : UIViewController

@property (nonatomic, strong) NSString *type;

@end

// push 出来的 ViewController 的 type 值为 1
[YFMediator push:@"ViewController" params:@{@"type" : @"1"}];

201612171222params.gif

短链映射(URL 绑定)

@interface YFMediator (YFRouter)

/**
 绑定 ViewController 和 URL
 eg. [YFMediator mapURL:@"login" toViewController:LoginViewController];
     [YFMediator push:@"login?user=laizw&password=123123"];
 
 @param url 短链
 @param viewController ViewController
 */
- (void)mapURL:(NSString *)url toViewController:(NSString *)viewController;

/**
 eg. 
 @{
   @"user/info" : @"UserInfoViewController",
   @"login"     : @"LoginViewController"
   ...
 }
 
 @param mapping mapping
 */
- (void)addMapping:(NSDictionary *)mapping;

/**
 删除短链
 
 @param url 短链
 */
- (void)removeURL:(NSString *)url;

@end

2016121738971Map.gif

创建 ViewController

YFMediator 中所有的 ViewController 默认都是通过这个方法创建,它会调用 init 方法来创建一个 ViewController

/**
 通过 ViewController 的 className 或者 短链 创建 ViewController
 可传入参数,默认为 nil

 @param viewController viewController(className | URL)
 @return Created ViewController
 */
- (UIViewController *)viewController:(NSString *)viewController;
- (UIViewController *)viewController:(NSString *)viewController params:(NSDictionary *)params;

自定义创建 ViewController

如果你的 ViewController 是通过 Storyboard 或者 Xib 创建的,或者你需要自定义创建一个 ViewController,在 YFMediator 有一个协议 YFMediatorProtocol,只需要实现协议分方法就可以。

@protocol YFMediatorProtocol <NSObject>

/**
 实现这个方法可以自定义创建 ViewController
 实现这个方法不会触发 YFMediatorInterceptBeforeSetValue 拦截

 @param params 传入的参数
 @return 返回的 ViewController
 */
- (instancetype)initWithParams:(NSDictionary *)params;

@end

ViewController 拦截器

YFMediatorViewController 的创建可以进行拦截处理

  1. 可以在 Intercept Handler 中修改 ViewController(创建之前传递的是 ViewController 的类名)
  2. 可以在修改需要传递的参数 params 的类型是 NSMutableDictionary
  3. 如果你不想创建这个 ViewController 只需要 return NO,那么就会终止创建这个 ViewController 并且返回 nil,默认通过的话请返回 YES
typedef BOOL(^YFMediatorInterceptHandlerBlock)(id *viewController, NSMutableDictionary *params);

typedef enum : NSUInteger {
    YFMediatorInterceptNotFound,        // handler(className | URL, params)
    YFMediatorInterceptBeforeInit,      // handler(className | URL, params)
    YFMediatorInterceptBeforeSetValue,  // handler(viewController, params),不会拦截实现 YFMediatorProtocol 的 ViewController
    YFMediatorInterceptAfterInit,       // handler(viewController, params)
} YFMediatorIntercept;

/**
 拦截操作,在 Mediator 创建 ViewController 的时候触发
 找不到对应的控制器 YFMediatorInterceptNotFound
 创建之前 YFMediatorInterceptBeforeInit
 赋值之前 YFMediatorInterceptBeforeSetValue
 创建完成 YFMediatorInterceptAfterInit
 
 如果 ViewController 实现了 YFMediatorProtocol,那么将不会拦截 setValue

 @param option YFMediatorIntercept
 @param handler YFMediatorInterceptHandler
 */
 - (void)intercept:(YFMediatorIntercept)option handler:(YFMediatorInterceptHandlerBlock)handler;

Installation

pod "YFMediator"

Author

laizw, i@laizw.cn

License

YFMediator is available under the MIT license. See the LICENSE file for more info.