用MVVM设计复杂的cell(光棍必看)

作者: imbaWales | 来源:发表于2016-11-14 15:50 被阅读424次

本文根据一个简单的例子来阐述MVVM框架设计模式.

老板娘?.png

如图,像这种cell我们可以在微博,新闻等很多软件看到. 这种cell的特点就是比较复杂, 它的高度是不确定的, 是根据网络请求回来的数据动态计算高度的.

cell的高度我们是通过table view的一个代理方法
heightForRowAtIndexPath来设置的,而这个方法是要写在控制器里面的.这就意味着如果我们用MVC的模式,那么就意味着我们要在控制器的这个代理方法里面动态的计算cell 的高度,像这种复杂的cell计算的的代码是非常多的. 这就让我们的控制器里面要写的代码非常多. 这样子控制器将非常臃肿.

而我们是面向模型开发,我们希望控制器里面不要参杂太多的业务逻辑,我们希望控制器只是一个调配资源的角色, 就像总经理一样吩咐着各种女秘书去做事, 而自己不用具体地做事.

那就在这里引入MVVM的概念.我们希望把cell的高度计算都写在另外一个地方(这个地方叫View Model).

首先介绍一下MVVM:
M是指Model: 保存网络数据
V是指View: 展示UI界面
VM是指View Model: 保存View的具体参数,包括内容和frame等

使用MVVM的好处是逻辑性非常强,扩展性非常好, 写代码的人写起来会非常顺畅且有条理性.
MVVM的缺点就是阅读性不好,对于不太熟练的人读起来会比较有难度, 这就一定程度导致维护成本的增加.

那么我们现在有4个东西: Controller, Model, View, View Model
这4个东西相互之间是怎么通讯和信息传递的呢? 请看下图:

看不明白就算了.png

在控制器中,拿到网络请求回来的数据, 转化为View Model, 再把View Model赋值给View . View拿到View Model后,根据View Model的参数来展示数据.

那么我们回到头文的例子,我们把这个cell划分为三个小块View, 把这三个View添加并展示在cell上:

划分模块.png View Model.png Controller.png Model.png View .png

在控制器中,拿到网络数据,并转成View Model,然后给cell的vm属性赋值

在View Model中重写item属性的setter方法,计算cell的具体高度

在cell中创建各个子view,并重写view model属性的setter方法,给子view的item属性赋值

在子View中拿到item,重写item属性的setter方法并把item展示的网络数据展示在UI界面

网络数据传递的过程是:
控制器 --(通过ViewModel)--> cell --(通过item)--> 子View

最后请看下图,我保证你不会再滚到头文中再看一遍第一张图

相关文章

  • 用MVVM设计复杂的cell(光棍必看)

    本文根据一个简单的例子来阐述MVVM框架设计模式. 如图,像这种cell我们可以在微博,新闻等很多软件看到. 这种...

  • iOS 使用MVVM模式实现Cell的点击响应

    iOS 使用MVVM模式实现Cell的点击响应 iOS 使用MVVM模式实现Cell的点击响应

  • MVVM框架思想

    1.MVVM是什么? 简单理解:mvc是一个cell面向一个model开发mvvm是一个cell面向一个viewM...

  • vue入门

    MVVM的介绍 vue的设计思想是基于MVVM实现的,那么什么是MVVM呢?简单介绍: 组成 MVVM ===> ...

  • 初探安卓MVVM框架设计

    初探安卓MVVM框架设计# 一. 什么是MVVM? MVVM是近几年流行的一种设计框架,基于该框架设计的应用程序具...

  • 面试

    1.mvvm的开发模式 可以解释一个微博的cell就是一个典型的vm,为什么用viewmodel,(减少之前mvc...

  • vue的ms题目

    1、什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写。mvvm 是一种设计思想。...

  • xib动态设置cell高度快速

    对于复杂布局的使用xib来布置cell的时候,用最新的方法: update: iOS version >= 8 注...

  • MVVM设计模式

    MVVM设计模式 在介绍MVVM设计模式之前我们先介绍一下DataBinding DataBinding,2015...

  • MVVM设计模式在Android编程中的应用

    MVVM设计模式在Android编程中的应用 大家好,这一期呢,我们来看一下mvvm的设计模式。 Mvvm的意思是...

网友评论

  • 经文纬武:写的太棒了。有demo在github吗?
    经文纬武:@imbaWales 一些细节的地方,还是想看看原码。如果大神手头还保留有Demo的话.还请能不吝分享。在此先谢过了 。2834384208@qq.com
    imbaWales:@花下眠 没有哦,建议自己写一遍
  • Noah1985:在iOS开发实践MVVM上,ViewController一般是被作为view部分的。而因为这种特殊性,一般会在VC上包含少量的业务逻辑,这些一般与页面布局相关。除了业务,它还提供一个平台,让ViewModel和View进行绑定。
    ViewModel则是包含主业务逻辑,例如网络请求,模型数据的转换。
    所以你这里的ViewModel只是作为一个VC的helper来使用,并非MVVM。
    imbaWales:@Noah1985 我这里VC就是在控制tableview及cell的生命周期,布局逻辑,点击cell的跳转以及将view和viewmodel绑定没错吧。在cell那个view里面控制它的子view的生命周期,view model处理三个子view的逻辑
    Noah1985:@imbaWales 传统的MVVM上是没有Controller的,但是IOS设计上有一个ViewController。VC的作用是控制View的生命周期,跳转,布局逻辑。所以它完全可以被看作是MVVM中的View,将拆出来的业务逻辑全部交给ViewModel就可以了,它也可以担任ViewModel与View绑定的角色。这点在用ReactiveCocoa实践中最明显。
    imbaWales:“ViewController一般是被作为view部分的”,这句话怎么理解
    网络请求和模型转换确实是不该写在控制器
  • 春泥Fu:我已经联系好网警了,你收拾下准备上警车。
    imbaWales:@春泥Fu 可以帮我洗一个东西吗
  • Oniityann:代码好眼熟:smirk:
    imbaWales:@Oniityann 纳尼:yum:
  • 估唔到:哎呦不错哦!

本文标题:用MVVM设计复杂的cell(光棍必看)

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