iOS架构设计03-MVC-变种

上篇文章我们介绍了Apple版的MVC,今天我们来介绍下一种常用的MVC其实也是基于Apple版MVC的一个变种,首先我们来看下变种的MVC是什么样子的如下图
MVC-变种

角色还是那三个角色

  • Model

这个地方不一样了哦,本来是我们的Controller负责和Model进行交互的,变种之后的View是可以拥有这个Model的,相当于View是知道Model的存在的,我们平时开发时可能就会产生这样的一个变种,这样的好处就是Controller的代码不会那么臃肿,我们把Model一些相关的操作封装到View里了

  • View

反馈一些事件给我们的Controller,上篇没有介绍如何反馈事件,像TableView是通过Delegate反馈给Controller的,我们一般也是用Delegate或者Block来反馈

  • Controller

还是拥有View,还是创建我们的Model,不同的是不用在Controller里更新View的数据了,这部分逻辑挪到View里了

Demo实例讲解

下面我们来看下Demo,(主要功能就是我们自定义个XXAppView,用来显示上面一张图,下面一行字的控件)

首先我们创建我们的Model,一共两个字段(name,image)

@interface XXApp : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *image;
@end

接着我们创建我们的View,这次我们的View会持有Model,我们定义一个Delegate用来把点击事件反馈给Controller

@class XXApp, XXAppView;

@protocol XXAppViewDelegate <NSObject>
@optional
- (void)appViewDidClick:(XXAppView *)appView;
@end

@interface XXAppView : UIView
@property (strong, nonatomic) XXApp *app;
@end
@interface XXAppView()
@property (weak, nonatomic) UIImageView *iconView;
@property (weak, nonatomic) UILabel *nameLabel;
@end

@implementation XXAppView

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        UIImageView *iconView = [[UIImageView alloc] init];
        iconView.frame = CGRectMake(0, 0, 100, 100);
        [self addSubview:iconView];
        _iconView = iconView;
        
        UILabel *nameLabel = [[UILabel alloc] init];
        nameLabel.frame = CGRectMake(0, 100, 100, 30);
        nameLabel.textAlignment = NSTextAlignmentCenter;
        [self addSubview:nameLabel];
        _nameLabel = nameLabel;
    }
    return self;
}

- (void)setApp:(XXApp *)app
{
    _app = app;
    
    self.iconView.image = [UIImage imageNamed:app.image];
    self.nameLabel.text = app.name;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if ([self.delegate respondsToSelector:@selector(appViewDidClick:)]) {
        [self.delegate appViewDidClick:self];
    }
}
@end

最后是我们的Controller,遵循ViewDelegate来响应点击事件

@interface ViewController () <XXAppViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建view
    XXAppView *appView = [[XXAppView alloc] init];
    appView.frame = CGRectMake(100, 100, 100, 150);
    appView.delegate = self;
    [self.view addSubview:appView];
    
    // 加载模型数据,我们以QQ为例
    XXApp *app = [[XXApp alloc] init];
    app.name = @"QQ";
    app.image = @"QQ";
    
    // 设置数据到view上
    appView.app = app;
//	Apple版的MVC你要这么做  
//    appView.iconView.image = [UIImage imageNamed:app.image];
//    appView.nameLabel.text = app.name;
}

#pragma mark - XXAppViewDelegate
- (void)appViewDidClick:(MJAppView *)appView
{
    NSLog(@"控制器监听到了appView的点击");
}

总结

那首先我们看看变种后的MVC的优缺点

  • 优点

Controller进行瘦身,将View内部的细节封装起来了,外界不知道View内部的具体实现

  • 缺点

View依赖于Model

每一种架构都有他的支持者和反对者,所以说没有哪个架构是最好的,只有哪个架构是最适合的,所以都是MVC大家选自己适合的就行

今天就先介绍到这里,明天我们来看看MVP,还有近期在学习数据结构和算法小程序Flutter,我会把笔记都记录下来的

One More Thing

喜欢的朋友可以扫描关注我的公众号(您的支持是我写作的最大动力)
iOS_DevTips

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值