MVC 设计模式
Model-View-Controller,简称 MVC,是 iOS 开发中常用的设计模式。
1.Model 模型
Model 封装了应用程序的数据,并定义和处理数据的逻辑和运算,它的主要工作是:
创建数据库,创建相应的表。
完成针对数据库各个表的增、删、改、查的操作。
映射数据库各个表的实体类(这个实体类的作用就是沟通数据库层(M)和控制层(C)的桥梁,同时这个实体类也将担负其后台数据(xml、sbjson等)与本地数据的沟通和存储)
2.View 视图
视图是用户可以直接看到的对象,例如,按钮、滑动条、文本框等,主要向用户提供 UI 界面,显示来自 Model 的数据,并对用户的操作作出响应。
3.Controller 控制器
控制器用于控制 View 呈现的内容,以及确保 View 和 Model 之间数据的同步。
MVC 通信机制
Model 和 View 不能直接相互通信,必须通过 Controller 传递,当 Model 中的数据发生变化时,与之对应的 View 更新,为此 iOS 提供了 NSnotification 和 KVO 两种机制。
在上图中,绿色的箭头代表直接引用,控制器需要知道 Model 的一切,还需要同 Model 完全通信的能力,按照任何方式使用其公共 API,因为控制器的工作就是将 Model 呈现给用户。类似的,从控制器到视图,通信也是不受限制的,当有一个属性,从控制器指向 View 时,将它称作 outlet。
Model 和 View 之间是无法直接通信的,因为 Model 是完全独立于 UI 的,它绝对不能与视图中的对象进行通信,它们之间需要 Controller 进行通信。
一、当 View 往回与 Controller 进行通信时,iOS 有三种常见的模式:
1)设置View对应的 Target Action。如设置UIButton的Touch up inside的Action Target。
控制器在自身设置一个目标,它会提供一个动作,就像一支箭一样,给到视图,对视图说,当你做了什么时,发送这个动作给我,通过这种方式,通用的按钮或者滑动条等,就能往回与 Controller 通信,但它并不知道这是什么样的控制器,它只知道自身发生什么之后,将消息发送给目标。这是一种“盲”的,简单的,结构化的方式。
2)设置 View 的 Delegate,如UIAlertViewDelegate, UIActionSheetDelegate,UITextFieldDelegate等。
当用户对 View 进行操作时,View 会通过 delegate 对控制器发出消息,will、should、did。例如,滚动视图,当用户滑动视图时,view 向控制器发送消息,通知控制器,用户已经滚动视图(did),或者将要滚动视图(will),我“应该”允许滚动吗(should)。
3)设置 View 的数据源(data source), 如UITableViewDataSource。
数据源不会考虑 will、did、should、它会要求记录 count,data 以及所在位置 at,数据源其实是一种 delegate,是一类获取数据的特殊委托。
二、从 Model 到 Controller 的通信
当模型中的事物发生变化时,控制器需要知道,例如,数据变化、数据库变化等。这时,可以通过一种电台的概念来广播信息,给任何感兴趣的人,iOS 中,执行这一功能的叫做通知(notification)和键值观察(KVO)。而控制器会监听 Model 的消息,当它发现事物正在变化时,它会通过直接调用与 Model 通信,让 Model 把变化了的数据给它。
三、多屏幕 app 的 MVC
可以合并多个 MVC,因为 MVC 能够将另一个 MVC 作为视图的一部分,