(iOS开发总结)MVC模式

一、MVC 模式

MVC,即模型-视图-控制器(Model-View-Model),是软件开发中应用甚广的一种设计模式。其用意是将数据与视图分化,利用模型数据控制视图的显示,但两者的交互由控制器控制。在iOS开发中,MVC模式应用很广,是iOS控件设计的主要模式之一。

UITableView与UICollectionView 可以说是iOS开发中最能体现MVC模式的两种控件,以下举UITableView为例,其中UITableViewCell是做显示任务的View,那么每行UITableViewCell都显示数据源(Datasource)对应的数据,如果把每行显示的数据封装成对象,那么我们把它们称为模型对象(模型数据Model)。

二、模型对象(Model)的封装

即使不把数据封装成对象,我们常见的就是字典(NSDictionary)和数组(NSArray),也能按部就班把数据布局到UITableViewCell上,一定层面上来说也是MVC模式。但为什么不把它封装成对象呢?有时候,数据的某些字段不能直接布局到View中显示,特别是遇到复杂的数据结构,这时封装成对象的好处就体现了,我们可以在对象中处理这些字段后再显示到View上。封装成对象,更加利于我们控制业务处理和编码,这可是在面向对象编程。

通常我们把数据封装成对象并不是难事儿,如果每行UITableViewCell显示的“布局格式”一样,直接对应把数据布局上去就行,某种意义上来说,UITableViewCell已经事先知道要显示什么了。比如微信的通讯录,就显示头像和名字,所以UITableViewCell“格式”事先已被确定,压根就不需要改变自己来适应显示下一条通讯成员。

但有些时候,每行UITableViewCell显示的“布局格式”都不一样,UITableViewCell永远不知道下一条到底要怎样布局,比如微博,UITableViewCell不知道下一条微博有没有转发,有没有图片,有图片的话有几张等等。那这时候应该怎样布局?

可以观察到,微博的数据格式是一定的,就是说一条什么都有(转发、图片等)的微博,这时候UITableViewCell中的子控件个数达到饱满,无论数据要显示什么,都有子控件可以显示。但如果有一条微博比如少了图片,那么要么remove这个显示图片的View,要么将这个显示图片的View的Frame设为CGRectZero(那么View的布局格式(如果我们把子空间的位置称为“布局格式”)也是确定的,只是subview的Frame在变)。可想而知只要将缺少的那些字段对应的View的Frame设为CGRectZero即可,不用反复移除添加subview (UITableViewCell 是采取循环回收利用的)。

这里有个问题,根据上面一段思路,可以自定义UITableViewCell,然后引用一个模型对象并重写其setter方法,在setter方法中拿到模型对象根据数据计算subview.frame并布局,缺少的字段对应的View.frame直接设为0。但是这样一来,上拉加载数据的时候需要时间计算Frame,那么界面效果会显卡,而且当回滚的时候又进行重复的计算工作。这时需要再新建一个模型(姑且称之为Handler模型),让它引用微博模型,然后将对微博模型的处理还有各个subview的frame的计算封装到Handler模型中,而自定义UITableViewCell则引用Handler模型。那么在加载数据的时候,该模型拿到微博模型数据在setter中即可计算subview.frame,这时UITableViewCell的subview的frame已经准备好,自定义UITableViewCell的模型的setter中直接布局和赋值数据(Handler模型引用着微博模型)

三、视图(View)的封装

  1. 根据模型对象(Model)的封装的介绍,遇到复杂的UITableView通常会自定义Cell,把不变的界面因素在初始化创建的时候就可以写定,动态的界面因素留给模型去控制。自定义UITableViewCell,让它引用模型对象并在其setter中布局并赋值,如果subview.frame仍不确定,则再封装一个Frame模型并引用模型对象,让自定义Cell引用F模型对象并在setter中布局。

    以上两种布局其实可以看成是一种,即UITableViewCell中的subviews的布局都是一定的了,即使是subview.frame为CGRectZero,但这个subview还必须存在,否则加载的时候会增加开销。

  2. 这里还有另外一种App常见的界面布局,即类似微信收藏的布局,每个UITableViewCell都属于一个类型,有图片、视频、文档等等,我尝试按照处理微博的方法来解决问题,但效果不如意。微信收藏这种布局参杂很多种类型,每个UITableViewCell只显示一种类型数据,显示了一种数据则一定不会有其它类型数据,如果按照微博数据处理方式处理,则在frame赋值的时候有一大串判断和CGRectZero,每每增加一种类型,就要修改源文件增加判断,处理要特别全面否则容易出现bug。尝试处理方法是自定义各种类型的UITableViewCell对应各种类型数据,给每种类型的UITableViewCell给定不同的Identifier。这样,图片只会被布局到图片Cell,文档只会被布局到文档Cell。
时间: 2024-09-23 12:06:45

(iOS开发总结)MVC模式的相关文章

(iOS开发总结)代理模式

一.代理模式 代理模式(Delegate)即委托模式,不仅在应用开发中经常使用,而且是iOS SDK设计中常见的一种设计模式,例如UIKit框架中UI的交互逻辑通常需要开发人员自定义代理类去处理. 开发中代理模式常见用途 传值 功能分化接口设计 交互接口(自定义控件) 二.理解 撇开学科概念,代理俩字的意思是:一方帮助另一方代为处理(完成)一些工作或者任务.作为名词,则这个"一方" 就叫代理.如此理解,代理也可为独立的一者. 那么在开发这里,开始应该是这样: 类A引用着一个类B对象,类

iOS开发系列--UITableView全面解析

概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是UITableView.当然它的广泛使用自然离不开它强大的功能,今天这篇文章将针对UITableView重点展开讨论.今天的主要内容包括: 基本介绍 数据源 代理 性能优化 UITableViewCell 常用操作 UITableViewController MVC模式 基本介绍 UITableView有两种风格:UITableViewSt

整合Java6脚本、Groovy实现动态MVC模式

一个有弹性的和动态的开发环境正在受到前所未有的关注,甚至连脚本语言也显现出这方面的特性,这也正是我们所需要的,也就是说,我们永远需要建立易维护,并且可满足我们需求的应用程序.如果我们要想使用脚本语言参与进来,我们应该考虑一下Java SE 6所提供的一个新的脚本API:一个与语言无关的允许开发人员在Java代码中使用脚本语言的框架.使用这套新API,我们不仅可以利用脚本语言的特性,而且还能使用很多和Java相关器工具. 在本文中,我们提供了一个实例,这个实例将尽可能体现这套API的特性.并且使用

《iOS 8开发指南》——第6章,第6.1节MVC模式基础

第6章 使用Xcode编写MVC程序 iOS 8开发指南 在本书前面的内容中,已经学习了面向对象编程语言Objective-C的基本知识,并且探索了Cocoa Touch.Xcode和Interface Builder编辑器的基本用法.虽然我们已经使用了多个创建好的项目,但是还没有从头开始创建一个项目.在本章的内容中,将向读者详细讲解"模型-视图-控制器"应用程序的设计模式,并从头到尾创建一个iOS应用程序的过程,为读者步入本书后面知识的学习打下基础. 6.1 MVC模式基础 iOS

《iOS 8开发指南(第2版)》——第6章,第6.1节MVC模式基础

6.1 MVC模式基础 iOS 8开发指南(第2版) 当我们开始编程时,会发现每一个功能都可以用多种编码方式来实现.但是,究竟哪一种方式才是最佳选择呢?在开发iOS应用程序的过程中,通常使用的设计方法被称为"模型-视图-控制器"模式,这种模式被简称为MVC,通过这种模式可以帮助我们创建出简洁.高效的应用程序. 6.1.1 诞生背景 在创建与用户交互的应用程序时,首先必须考虑如下3点. 用户界面:我们必须提供让用户能够与之交互的东西,例如,按钮和文本框等. 对用户输入进行处理并做出反应.

《企业级ios应用开发实战》一3.3 MVC模式

3.3 MVC模式 MVC模型是应用程序设计者们普遍采用的一种设计模式,在第2章介绍Cocoa Touch框架时曾简单介绍了MVC.MVC模式把应用程序GUI代码根据功能拆分为不同的类或组件: "模型":用于封装应用程序的数据: "视图":负责显示和编辑数据: "控制器":负责处理前两者之间的逻辑关系. 它们之间的逻辑关系参考第2章的图2-3. Cocoa Touch本身也遵循MVC模型原则.在MVC模型下,3个层次都由截然不同的类来实现,

iOS开发入门:iOS常用设计模式–委托模式

对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模式从GoF 设计装饰(Decorator).适配器(Adapter)和模板方法(Template Method)等模式演变而来.几乎每一个应用都会或多或少地使用到委托模式.不只是CocoaTouch框架,在Cocoa框架中委托模式也得到了广泛的应用. 问题提出 对于应用生命周期的非运行状态--应用启

iOS 开发中的 Flux 架构模式

本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时分享我们目前积累到的经验. 我尝试通过讨论代码来描述我们大部分的 Flux 实现, 它用于我们今天的产品中. 如果你只对综合结果感兴趣, 请跳过这篇文章的中间部分. 为什么从 MVC 转移 为了引入我们的决定, 我想要先谈一谈 PlanGrid 这个应用遇到的一些挑战.一些问题仅针对企业级应用程序,

iOS开发那些事-iOS常用设计模式–委托模式

对于iOS开发,举例Cocoa框架下的几个设计模式为大家分析.当然,Cocoa框架下关于设计模式的内容远远不止这些,我们选择了常用的几种:单例模式.委托模式.观察者模式.MVC模式. 委托模式 委托模式从GoF 设计装饰(Decorator).适配器(Adapter)和模板方法(Template Method)等模式演变而来.几乎每一个应用都会或多或少地使用到委托模式.不只是CocoaTouch框架,在Cocoa框架中委托模式也得到了广泛的应用. 问题提出 对于应用生命周期的非运行状态--应用启