zoukankan      html  css  js  c++  java
  • MVVM框架思想

    1.MVVM是什么?
    M:模型
    V:视图
    VM:视图模型

    简单理解:mvc是一个cell面向一个model开发
    mvvm是一个cell面向一个viewModel开发, viewModel里面又包含model
    mvvm优点:抽取方法更加的详细,业务逻辑划分更加明确,让控制器更加轻量级
    缺点:不利于维护,可读性不太好

    2.MVVM框架的使用(以计算不等高cell为例)
    上面的分析指导,计算cell高度要在网络请求里面记性

    2.1自定义一个topView模型
    定义成员属性接收服务器返回(要展示到view上)的数据

    2.2自定义一个viewModel模型
    先定义一个topView的模型属性,来保存模型数据
    在定义一些属性,来保存计算出来的数据(比如:cell的高度和frame)

    2.3数据请求成功,先把我们需要的字典数组转成模型数组

    2.4再把模型数组转换成 视图模型 数组,并保存起来(定义一个数组成员变量)

    1 // 模型转视图模型
    2 for (XMGThemeItem *item in themes) {
    3 XMGThemeViewModel *vm = [[XMGThemeViewModel alloc] init];
    4 // 计算cell子控件frame和cellH
    5 vm.item = item;
    6 [self.themeViewModels addObject:vm];

    注意:给视图模型赋值的时候(vm.item = item;),会触发视图模型成员属性item的set方法
    我们就是在item的set方法里面计算cell的frame和高度的,
    也就是说,模型全部转为视图模型之后,cell的frame和高度已经全部确定了
    只需要在视图模型定义成员属性保存frame和高度,用的这时候直接取就可以了

    3.怎么展示数据?

    3.1在自定义cell里面定义 一个视图模型来接收数据

    3.2在cellForRow方法里面给cell的视图模型赋值(通过从数组中取出对应的视图模型)

    1 cell.vm = _themeViewModels[indexPath.row];

    3.3在给cell的视图模型赋值的时候,会触发vm的set方法,会调用vm的set方法
    在set方法里面给topView的模型赋值,并取出cell的frame和高度

    1 - (void)setVm:(XMGThemeViewModel *)vm
    2 {
    3 _vm = vm;
    4 // topView:传递模型
    5 _topView.item = vm.item;
    6 // 设置topViewFrame
    7 _topView.frame = vm.topViewFrame;
    8 }

    3.4怎么给模型赋值(也就是展示数据)
    在setVm方法里面会触发模型的set方法_topView.item = vm.item;
    也就是说,这句代码,就把视图模型保存的服务器数据,传递给topView中定义的模型属性

    3.5在topView的item的set方法里面,我们完成给cell的子控件赋值的过程

    1 - (void)setItem:(XMGThemeItem *)item
    2 {
    3 _item = item;
    4 
    5 [_iconView sd_setImageWithURL:[NSURL URLWithString:item.profile_image]];
    6 _nameView.text = item.name;
    7 _timeView.text = item.create_time;
    8 _textView.text = item.text;
    9 }

    topView的这些子控件通过从xib连线获得

    3.6在哪里给cell的高度赋值?
    在heightForRow方法里面

    1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;0


    1
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 2 { 3 XTThemeViewModel *vm = _themeViewModels[indexPath.row]; 4 return vm.cellH; 5 }
  • 相关阅读:
    使用BeyondCompare作为Subversive的比较器
    Ubuntu下安装jdk6的方法和步骤
    推荐几款通用的数据库管理工具
    通用数据库都有哪些
    Linux下卸载ORACLE的多种方法(参考使用)
    jar包查询网站 非常好用!
    8种Nosql数据库系统对比
    SQL2005数据库镜像的步骤
    建立与删除SQL 2008事务复制发布
    同步复制JOB说明
  • 原文地址:https://www.cnblogs.com/xiaotian666/p/5742592.html
Copyright © 2011-2022 走看看