iOS学习之MVC模式

一、MVC模式 

MVC概念

MVC把软件系统分为三个部分:Model,View,Controller。分别对应的就是模型-视图-控制器

Model:封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算

View:是应用程序中用户可以看见的对象

Controller:充当Model与View之间的媒介。View中进行的用户操作可以通过Controller传达给Model,Controller也可将Model传递给View,以便View可以显示它

Model与View之间不能相互通信

MVC之间的交流模式


MVC.png

图中有几条线把这三部分划分开,有黄线,虚线,和白色的实线。我们把它们想象成路标

你可以看到,在M和V之间有两条黄线,这表示什么呢?它意味着你不能 穿越这黄线,任何一个方向都不行,即M和V完全分离

在图的上部,你可以看到白色的虚线,它意味着你可以自由的穿越它,只要是安全的

那白色的实线呢?它代表你可以穿越,但你必须要买票,或者交点过路费

Controller与Model

首先,我们来看C和M之间的绿色箭头,这箭头的方向就代表着“发起对话”的方向

也就是说,发起对话的是C,而做出回答的是M。C可以问M各种各样的问题,但M只是回答C的问题或要求,它不可以主动的向C要求什么

还记得虚线是畅通无阻的意思吧,所以,C知道M的所有的事情

如果用代码来说明这件事情,就是说,C可以导入M的头文件或是M的接口(API)。因为C可以通过M的API,所以它就可以肆无忌惮的向M要求这要求那了

Controller与View

我们再来看看另外的一个绿色箭头,它是在C和V之间,和前一个绿色箭头的意义一样,它代表C可以直接地向V进行交流

你可以想想,C要把V放到屏幕上,并设置V的属性,告诉它们什么时候从屏幕上消失,把它们分成组等等。

如果C不能自由的向V发号施令的话,程序的显示将会多么的困难。所以,C可以毫无限制地向V说话。

可能你已经注意到了,这个箭头上还有outlet(输出口),outlet可以看作是从C指向V的指针,它在C中被定义

outlet给我们提供了很大的方便,它使我们在C的内部就可以轻松准确地向V施令

C可以拥有很多的outlet,可以不止一个,这也使它可以更高效的和V进行交流

Model与View

那M和V之间可以交流么?还记得黄线的意思么?完全不可以通过,所以我们是不允许M和V进行交流的

这是因为我们不希望这三部分之间有过多的交流

你想想,假如V在显示时出现了问题,比如有一个图形没有显示出来,我们就要去查找错误

因为C可以和V交流,M也可以和V交流的话,我们就要去检查两个部分

相反的,只有C可以和V交流的话,在出错时,我们就只需要去C那里查找原因,这样查找错误不就很是简单了么?

所以,我们不允许M和V之间有直接的联系,这也是在它们两之间有两根黄线的原因

总结

(1)Model和View永远不能相互通信,只能通过Controller传递。

(2)Controller可以直接与Model对话(读写调用Model),Model通过Notification和KVO机制与Controller间接通信。

(3)Controller可以直接与View对话,通过outlet,直接操作View

outlet直接对应到View中的控件,View通过action向Controller报告事件的发生(如用户Touch我了)

Controller是View的直接数据源(数据很可能是Controller从Model中取得并经过加工了)

Controller是View的代理(delegate),以同步View与Controller

我们接下来讨论V是如何向C发送信息的。V对C的交流有三种不同的方式:

第一种我们称为目标操作(target-action)

它是这样工作的,C会在自己的内部“悬挂”一个目标(target),如图中的红白相间的靶子

对应的,它还会分发一个操作(action,如图中的黄色箭头)给将要和它交流的视图对象(可能是屏幕上的一个按钮)

当按钮被按时,action就会被发送给与之对应的target,这样V就可以和C交流了

但是在这种情况下,V只是知道发送action给对应的target,它并不知道C中的类,也不知道它到底发送了什么。target-action是我们经常使用的方法。

第二种方式我们叫做委托(delegate)

有时候,V需要和C进行同步,你知道,用户交互不仅仅是什么按按钮,划滑块,还有很多种形式

好了, 让我们来看看图中的delegate黄色箭头,你发现箭头上又分出了四个小箭头:should,did,will,还有一个没标注的

绝大部分的delegate信息都是should,will,did这三种形式

和英文意思相对应,should代表视图对象将询问C中的某个对象“我应该这么做么?”

举个例子,有一个web视图,有人点击了一个链接,web视图就要问“我应该打开这个链接么?这样做安全么?”。这就是should信息

那 will和did呢?will就是“我将要做这件事了”,did就是“我已经做了这件事”

C把自己设置为V的委托(delegate),它让V知道:如果V想知道更多的关于将如何显示的信息的话,就向C发送delegate信息。通过接受V发过来的delegate信息,C就会做出相应的协调和处理

还有一点,每个V只能有一个delegate

第三种方式就是数据源(datasource)

V不能拥有它所要显示的数据,记住这点非常重要

V希望别人帮助它管理将要显示的数据,当它需要数据时,它就会请求别人的帮助,把需要的数据给它

再者,iphone的屏幕很小,它不能显示包含大量信息的视图。看图中的datasource箭头,和delegate类似,V会发送cout,data,at信息给C来请求数据。

对于不同的UIView,有相应的UIViewController,对应MVC中的C。例如在iOS上常用的UITableView,它所对应的Controller就是UITableViewController

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352