iOS中MVC设计模式
作者:网络转载 发布时间:[ 2015/5/5 13:34:51 ] 推荐标签:移动开发
首先, 我们来看C和M之间的绿色箭头,这箭头的方向代表着“发起对话”的方向,也是说,发起对话的是C,而做出回答的是M。C可以问M各种各样的问题,但M 只是回答C的问题或要求,它不可以主动的向C要求什么。还记得虚线是畅通无阻的意思吧,所以,C知道M的所有的事情,如果用代码来说明这件事情,是 说,C可以导入M的头文件或是M的接口(API)。因为C可以通过M的API,所以它可以肆无忌惮的向M要求这要求那了。
我们再来看看另外的一个绿色箭头,它是在C和V之间,和前一个绿色箭头的意义一样,它代表C可以直接地向V进行交流。你可以想想,C要把V放到屏幕 上,并设置V的属性,告诉它们什么时候从屏幕上消失,把它们分成组等等。如果C不能自由的向V发号施令的话,程序的显示将会多么的困难,所以,C可以毫无 限制地向V说话。
可能你已经注意到了,这个箭头上还有outlet(输出口),outlet可以看作是从C指向V的指针,它在C中被定义。outlet给我们提供了很大的 方便,它使我们在C的内部可以轻松准确地向V施令。C可以拥有很多的outlet,可以不止一个,这也使它可以更高效的和V进行交流。
那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。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
了解ios自动化测试要知道哪些知识?IOS配置、远程设备管理和TestAgent的启动方式移动测试工具MR是如何进行IOS设备录制以及相关脚本命令编辑操作的?MobileRunner iOS部署文档iOS单元测试iOS遭攻击频率低于安卓 但后果更严重iOS的JSON解析及用例设计iOS UnitTest单元测试(iOS)一个让我找了6小时的BugAppium iOS 10 跑起来浅谈iOS单元测试iOS UI自动化测试初探iOS APP打包分发给远程的手机测试复杂业务场景下如何进行iOS端自动化测试微信关闭iOS版公众号打赏功能,只因苹果想分成?苹果企业账号遭滥用:iOS漏洞“留出”赌博应用通道
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南