今天看啥  ›  专栏  ›  c4ibd3

CTMediator 的初体验

c4ibd3  · 掘金  ·  · 2020-04-02 05:01
阅读 446

CTMediator 的初体验

接触的前提

​ 现在对于iOS开发的要求随着时代的发展,也在渐渐地演变。这几天看到了很多JD的要求,多多少少都会提到这样的一个名字-组件化。

个人对于组件化的理解

​ 一开始我对于组件化的理解还是很模糊的,总觉得很高端很大气很上档次的感觉。有种看得见摸不着的感觉。我的理解就是把项目中的多个小功能组件进行私有库化,让他不依赖于项目,降低项目中的耦合性。其实在一般开发中也用到过。CocoaPods我理解为也是组件化的一种形式。

CTMediator——中介者

​ 个人理解为跳转的统一派送中心,有点和物流中转站差不多。统一处理页面的跳转逻辑。

CTMediator使用教程

一般原生页面的跳转

#import "CTMediatorTestViewController.h"
#import "CTMediatorPushViewController.h"
@interface CTMediatorTestViewController ()

@property (nonatomic, strong) UIButton *normalPushButton;

@end

@implementation CTMediatorTestViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.normalPushButton];
    [self.normalPushButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(100);
        make.left.equalTo(self.view).offset(10);
    }];
}
#pragma mark - 点击事件
- (void)normalPushButtonTapAction:(UIButton *)button{
    CTMediatorPushViewController *normalPushVC = [[CTMediatorPushViewController alloc]init];
    [self.navigationController pushViewController:normalPushVC animated:YES];
}
#pragma mark - 懒加载
- (UIButton *)normalPushButton{
    if (!_normalPushButton) {
        _normalPushButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [_normalPushButton setTitle:@"常规Push"
                           forState:UIControlStateNormal];
        [_normalPushButton setTitleColor:[UIColor blackColor]
                                forState:UIControlStateNormal];
        [_normalPushButton addTarget:self
                              action:@selector(normalPushButtonTapAction:)
                    forControlEvents:UIControlEventTouchUpInside];
    }
    return _normalPushButton;
}
@end
复制代码

这就是很简单原生页面的跳转。当我们一个页面要去跳转不同的ViewController的时候就要在上面#import "xxxxxxx.h"。久而久之页面就会有很多的 引入文件。如果这个ViewController可以在别的项目中用到的话那是不是也要将这些引入的#import "xxxxxxx.h"也一并带入。这样就会让项目耦合性很高。

CTMediator Target-Action 实现页面跳转

我们依然使用上面的那两个控制器来实现。

1.创建 Target-Action

我们需要创建一个Target_Push类,在这个类中的.h文件中我们要添加一个函数来对目标控制器进行实例化,如果需要参数也可以进行一些赋值操作。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface Target_Push : NSObject

- (UIViewController *)Action_NativeToCTMediatorPushViewController:(NSDictionary *)params;

@end
复制代码

然后我们在.m文件中实现我们所定义的函数

#import "Target_Push.h"
#import "CTMediatorPushViewController.h"


@implementation Target_Push

- (UIViewController *)Action_NativeToCTMediatorPushViewController:(NSDictionary *)params{
    CTMediatorPushViewController *pushVC = [[CTMediatorPushViewController alloc]init];
    if ([params valueForKey:@""]) {
        
    }
    return pushVC;
}

@end
复制代码
2.创建 CTMediator 的 Category

我们在创建的分类中定义这样的一个函数

#import <CTMediator/CTMediator.h>
#import "BaseViewController.h"

@interface CTMediator (PushActions)

- (BaseViewController *)dtp_mediator_ctmediatorPushViewControllerWithParams:(NSDictionary *)params;

@end
复制代码

这里的ViewController统一用了BaseViewController如果是用UIViewController 不要忘记了\#import <UIKit/UIKit.h>。然后我们来实现这个函数

#import "CTMediator+PushActions.h"
//  1. kCTMediatorTarget_Push字符串 是 Target_xxx.h 中的 xxx 部分
NSString * const kCTMediatorTarget_Push = @"Push";
//  2. kCTMediatorActionNativeTo_NewsViewController 是 Target_xxx.h 中 定义的 Action_xxxx 函数名的 xxx 部分
NSString * const kCTMediatorActionNativeTo_NewsViewController = @"NativeToCTMediatorPushViewController";

@implementation CTMediator (PushActions)

- (BaseViewController *)dtp_mediator_ctmediatorPushViewControllerWithParams:(NSDictionary *)params{
    
    BaseViewController *viewController = [self performTarget:kCTMediatorTarget_Push
                                                      action:kCTMediatorActionNativeTo_NewsViewController
                                                      params:params
                                           shouldCacheTarget:NO];
    if ([viewController isKindOfClass:[BaseViewController class]]) {
        GGLog(@"%@ 实例化页面成功", NSStringFromSelector(_cmd));
        return viewController;
    }else{
        GGLog(@"%@ 未能实例化页面", NSStringFromSelector(_cmd));
        return [[BaseViewController alloc]init];
    }
}

@end
复制代码
调用实现
#import "CTMediatorTestViewController.h"
#import "CTMediator+PushActions.h"
@interface CTMediatorTestViewController ()

@property (nonatomic, strong) UIButton *normalPushButton;

@end

@implementation CTMediatorTestViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.normalPushButton];
    [self.normalPushButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(100);
        make.left.equalTo(self.view).offset(10);
    }];
}
#pragma mark - 点击事件
- (void)normalPushButtonTapAction:(UIButton *)button{
    NSDictionary *params = @{@"title":@"CTMediatorPushViewController"};
    BaseViewController *pushVC = [[CTMediator sharedInstance] dtp_mediator_ctmediatorPushViewControllerWithParams:params];
    [self.navigationController pushViewController:pushVC animated:YES];
}
#pragma mark - 懒加载
- (UIButton *)normalPushButton{
    if (!_normalPushButton) {
        _normalPushButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [_normalPushButton setTitle:@"Target-Action 实现页面跳转"
                           forState:UIControlStateNormal];
        [_normalPushButton setTitleColor:[UIColor blackColor]
                                forState:UIControlStateNormal];
        [_normalPushButton addTarget:self
                              action:@selector(normalPushButtonTapAction:)
                    forControlEvents:UIControlEventTouchUpInside];
    }
    return _normalPushButton;
}
@end
复制代码

但是使用起来的过程 感觉似乎还没有之前的直接Push凡是简单。可能是我现在的理解还是不够深吧~~~




原文地址:访问原文地址
快照地址: 访问文章快照