MVC

作者: 孙卓卓 | 来源:发表于2018-11-12 13:46 被阅读0次

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

    Model和View永远不能相互通信,只能通过Controller传递。
    Controller可以直接与Model对话,Model通过Notification和KVO机制与Controller间接通信。
    Controller可以直接与View对话,通过outlet,直接操作View,outlet 直接对应到View中的控件,View通过action向Controller报告事件的发生。Controller是View的直接数据源。Controller是View的代理,以同步 View与Controller。

    控制器(Controller)--> 负责转发请求,对请求进行处理。
    视图(View) --> 界面设计人员进行图形界面设计。
    模型(Model) --> 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

    Model层: 数据处理层,包括网络请求,数据加工
    View层: 所有App上看得到的界面
    Controller层: Model 与 View层的中介,把Model数据在View上展示出来
    目的: 低耦合,可复用

    如何告别MC模式,真正走到MVC?

    先给自己洗脑,iOS的Controller不是UIViewController,而是普通的Controller,没有View。(很关键的一步)
    模块化划分,每个模块对应自己的一个View,例如Demo2模块,View层里面有个Demo2View,将界面元素写到View中
    知识1:如何传值(参数)

    //View
    + (instancetype)viewWithTitleStr:(NSString *)titleStr{
         
        //do createView
        //...
    }
     
    //Controller
    @implementation DemoViewController
     
    - (void)viewDidLoad {
        [super viewDidLoad];
         
        /*setupUI*/
        //1.createView - 参数通过`View`的函数作为外部参数传进去
        DemoView *view = [DemoView viewWithTitleStr:@"我是参数"];
        [self.view addSubview:view];
    }
    

    知识2:控件点击事件如何回调给控制器

    //View
    @implementation DemoView
     
    - (instancetype)initWithTitleStr:(NSString *)titleStr{
        if (self = [super init]) {
             
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeInfoDark];
            [self addSubview:btn];
            [btn addTarget:self action:@selector(p_clickBtn:) forControlEvents:UIControlEventTouchUpInside];
        }
        return self;
    }
     
    - (void)p_clickBtn:(UIButton *)sender{
         
        //通过代理回调
        [_delegate respondsToSelector:@selector(clickBtn:)] ?
        [_delegate clickBtn:sender] : nil;
    }
     
    //Controller
    @implementation DemoViewController
     
    - (void)viewDidLoad {
        [super viewDidLoad];
         
        //setupUI
         
        //1.createView
        DemoView *view = [DemoView viewWithTitleStr:@"我是参数"];
        view.delegate = self;
        [self.view addSubview:view];
    }
     
    #pragma mark - privateDelegate
    - (void)clickBtn:(UIButton *)sender{
        //View层按钮的点击事件回调~
    }
    

    MVC架构分明,在同一个模块内,如果视图有问题,找到该模块的View就行,其他同理,Controller代码大大减少,负责View的代理事件就可以
    可以复用,比如你一个产品列表的数据,首页也要用,产品页也要用,直接分别在其对应的VC1 && VC2 调用函数[ProductModel fetchDatas]即可,无需写多次,View的复用同理
    结构分明,便于维护,拓展也是在此基础上拓展,代码干净简洁。

    相关文章

      网友评论

          本文标题:MVC

          本文链接:https://www.haomeiwen.com/subject/jfgnxqtx.html