Skip to content
iOS Mediator —— iOS 组件化时代,高效解决端内页面跳转
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
YFMediator
YFMediatorDemo.xcodeproj
YFMediatorDemo.xcworkspace
YFMediatorDemo
YFMediatorDemoTests
.gitignore
.travis.yml
LICENSE
Podfile
Podfile.lock
README.md
YFMediator.podspec

README.md

YFMediator

License   Support   CI Status   Pod

iOS 组件化的时代到临

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

强烈建议配合 YFRouter 使用 !!

Changelog

  • 0.1.4 支持自定义转场动画
  • 0.1.7 初始化赋值由 perform setter 改为 setValue:forKey:
  • 0.1.8 支持 AlertActionSheet
  • 0.1.9 支持多种自定义初始化方式

Usage

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

NavigationController 基类

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

[YFMediator shared] registerNavigationController:[BVNavigationController class]];

页面跳转

Push

NSString * const kYFDetailViewController = @"YFDetailViewController";

[[YFMediator shared] push:kYFDetailViewController animate:YES params:@{@"title": @"detail"}];

Present

[[YFMediator shared] present:kYFDetailViewController animate:YES params:nil withNavigation:YES];

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;
页面跳转.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 shared] push:@"ViewController" animate:YES params:@{@"type" : @"1"}];
参数传递.gif

短链映射(URL 绑定)

*需要注意:URL 绑定功能需要 YFRouter 支持。

@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
短链映射.gif

创建 ViewController

所有的 ViewController 默认都是通过调用 init 方法来创建。

- (__kindof UIViewController *)viewController:(NSString *)viewController;
- (__kindof UIViewController *)viewController:(NSString *)viewController params:(NSDictionary *)params;
- (__kindof UIViewController *)viewController:(NSString *)viewController params:(NSDictionary *)params withNavigation:(BOOL)hasNav;

自定义创建 ViewController

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

/**
 自定义创建 ViewController
 
 - 支持多种方式创建(优先级排序):
    + viewControllerWithParams:
    - initWithParams:
    + nibName
    + storyboard
 
 - viewControllerWithParams: 和 initWithParams: 不会触发 YFMediatorInterceptBeforeSetValue 拦截
 */
@protocol YFMediatorProtocol <NSObject>
+ (instancetype)viewControllerWithParams:(NSDictionary *)params;
- (instancetype)initWithParams:(NSDictionary *)params;
+ (NSString *)nibName;
+ (NSString *)storyboardName;
+ (NSBundle *)customBundle;
@end

ViewController 拦截器

ViewController 的初始化进行拦截处理

  1. 可以在 Intercept Handler 中修改 ViewController(创建之前传递的是 ViewController 的类名)
  2. 可以在修改需要传递的参数 params 的类型是 NSMutableDictionary
  3. 如果你不想创建这个 ViewController 只需要 return NO,那么就会终止创建这个 ViewController 并且返回 nil,默认通过的话请返回 YES
/**
 拦截操作,在 Mediator 创建 ViewController 的时候触发
 找不到对应的控制器 YFMediatorInterceptNotFound
 创建之前 YFMediatorInterceptBeforeInit
 赋值之前 YFMediatorInterceptBeforeSetValue
 创建完成 YFMediatorInterceptAfterInit
 
 如果 ViewController 实现了 YFMediatorProtocol,那么将不会拦截 setValue

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

转场动画

0.1.4 之后,YFMediator 支持转场动画,这会让在开发中更加方便快捷的使用转场动画。

支持 pushpresentpopdismiss

// push & present
[[YFMediator shared] push:kYFDetailViewController
                   params:nil
                 animator:[YFMaterialAnimator expandAnimator]];
                 
// pop & dismiss
[[YFMediator shared] pop:[YFMaterialAnimator shrinkAnimator]];

Alert

0.1.8 之后可以快速调起一个 Alert 或者 ActionSheet。

[[YFMediator shared] alertWithTitle:@"您确定要退出当前页面吗?" items:@[@"确定"] cancel:@"取消" selected:^(UIAlertAction *action) {
    if ([action.title isEqualToString:@"确定"]) {
        [[YFMediator shared] pop];
    }
}];

ActionSheet

[[YFMediator shared] actionSheetWithItems:@[@"第一个", @"第二个"] cancel:@"取消" selected:^(UIAlertAction *action) {
    // ...
}];

Installation

pod "YFMediator"

Author

laizw, i@laizw.cn

License

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

You can’t perform that action at this time.