iOS里面MVC模式详解

iOS里面MVC模式详解

MVC是IOS里面也是很多程序设计里面的一种设计模式,M是model,V是view,C是controller。MVC模式在ios开发里面可谓是用得淋漓尽致。


以下是对斯坦福大学ios开发里面MVC模式的一段话的翻译

主要的宗旨是把所有的对象分为3个阵营,model阵营,view阵营,或者是controller阵营

model(APP的目的)

举个例子,你要做一个打飞机的游戏,那么这个就是太空中这辆飞船的位置,什么机型,每个飞船有多少机枪,护甲有多少等等。这就是model所做的事,而飞机在屏幕上的位置与model没有关系。

model的作用是怎么把model展现在用户面前,它获取了飞船在太空中的位置,然后算出怎么在屏幕上展现出来。

这就是controller,controller控制如何在UI上展现model

view就是controller在仆人,view就是controller所使用的工具。我们尽可能地使view阵营里面的对象通用化。

就像按钮、滑动条等,这些都是苹果自带的。controller利用这些通用的view来做model所需要做的事,view应该是很通用的。因为系统上有好多view,还有和应用相关的功能来控制view。我们要更先进一点,利用通用的view来理解和使用这些功能。



controller向model发消息是100%被允许的,这个箭头是绿色箭头,controller可以问model任何问题,controller知道model的任何事情,因为controller就是用来把model展现在屏幕上,所有它要有完全的访问权,这个箭头是单向的,所以只有controller知道model,这里面的像一个交通标志,从controller到model是白色虚线,所以可以随时跨过去,等一会,我们会看到这个虚线不是一直是虚的。那么controller和view的通信会是怎么样?也是绿色箭头,controller是要吧model显示在屏幕上,所以它可以对view做任何事。例如设个标志,让view做些事情,在屏幕上排列view,数据通信,所以这条路也是白色的虚线,你们看见那个词outlet

outlet是一个表达式用来表示controller的用来和view通信的一个属性,所以我们要在controller里创建outlets到view中去,那model和view怎么样?这门课的宗旨,它们永远不会互相通信。我相信你们都理解为什么model不和view通信,因为model和用户交互界面无关,你可以有一个飞船射击游戏的model,然后通过view来控制,移动飞船到XYZ,射击,你可以这么做,虽然比较笨但你可以这么做。

所以model是完全ui独立的,你们都应该明白model不应该和view通信,有些人说,我有一些自定义的view,掌控者model,所以能够显示model。这听起来挺吸引人的,但这不是一个好主意的原因-重用。因为你吧view和model连在了一起,model变了以后view也要重写,view不能被重复利用,model也不能被 其他ui用

比如iPad出来了,因为屏幕大小的原因需要一个新的ui,你就得重写整个view,最好是把这部分放到controller里,建一些更通用的view对象;另一个原因是,如果view和model通信,那么现在所有人都能和model通信了,view和model通信 ,controller和model通信,model就有点hold不住了,如果只有controller和model通信就能很容易搞清楚程序在干嘛,所以把view排除在外,view只是controller的仆人,让controller来通信。所以,在这门课上永远不会发生view和model相互通信的情况,双实线如果你越线我就给你开罚单。view能否允许和controller通信?答案是在某种程度上是可以的,所以这条线是黄色的。view(通用的)和controller(详细控制如何在屏幕展现model)之间的通信是不可见的,view不知道之间在和谁说话,但有一个好的架构。所以在xcode我们可以很好的有组织的连接view和它的controller。所以,view向controller通信的方法,有结构的方法,一个被称为target action。target action很简单,就是controller自己画了一个target,然后把一个action交个它的view。当view发生了一些事,比如按钮被按滑动条被滑动,它会把action发到target,然后controller就知道按钮被按了。这就是view向controller通信的机制,view回报controller发生了什么。但是view对controller知道的并不多,只是简单的发送target action。事实上,还有view和controller之间比较复杂的通信—比如view和controller要保持同步,所以常常view要告诉controller发生了什么,这是图上的did,或者将要发生什么,这是will,或者要问controller我是否允许什么发生,所以这些will,did,should是view要问的问题。这么做的原因是因为controller把自己设成委托,用协议,希望你们都知道什么是协议,我们会在obj-c里会讲到,设定一个协议,来回应will did should在一次,view不用知道回应的controller是哪个类 delegation是另一个view和controller通信的方法,另一个很重要的事是,view不是它显示的数据的所有者,这很重要:所以用红色来显示,你们要了解view没有数据,view只是一个平面,用来显示数据,一个显示信息的平台,view没有 实体变量也不会去存储,只有指向他们的指针,所以你iPod库里面 的1000首歌不会是view的实体变量,这种设计使得,比如view不会去管理数据库,跟新iPod歌曲库,这不是view干的活,而是controller或者model干的,如果view不拥有它所显示 的数据,它如何获得数据呢?一个类似delegation的方法,它又一些协议,比如这里的data at和count,这对一个表挺有用的,表可以问表里有多少东西 ,比如5000,那好我要地100到150条的数据,我要用来显示 ,所以view去根据需求来请求数据,这会非常高效的,如果另外一头知道怎么管理一个巨大的数据库,而只是提取其中需要的几条,因为ipod里有10000首歌,但屏幕上只显示7首。你要这种功能,但不要把它写在一个view里,view是通用的用来显示的,controller金额model一起来有效率的提供信息,类似地,view会有一个数据源的设置,controller会回应数据源,注意,数据源的delegation永远是controller,或者是controller的指定的第三方,但不可能是model,controller的工作是把model的信息传递给view,响应所有的delegation。因为它能获取model里的数据,决定怎么在屏幕上显示,这是它的职能,所以它要参与这个循环,你们可能需要这些data at和count的方法,可能只是一行代码,问model数据是什么,然后model把数据给你,即使这是一行代码,也需要controller来参与,因为这是controller的工作,获取model显示在屏幕上,我反复讲了5编,这是controller的工作,在iOS开发这很重要,你要给他机会做他的工作,永远不要越过view和model中间的线,还有一件事,model能向controller发话吗这个很明显,肯定不行的。model是ui独立的,不能向controller发话,这是controller的工作来用view显示model,那么当model的一些东西改变了,你要更新controller的时候该怎么办呢?你有个数据库,某人在数据库里写了些东西,比如你的飞船游戏里的其他玩家攻击了你 的飞船,现在model改变了是因为飞船受伤了 。

在iOS里面我们实现的方法是用一个广播站就像信息广播机制,有2个机制,通知关键数据监听,当model改变了,它就在广播站里广播,controller收听到了,然后去model什么东西改了。这是完全不可见的,同步的,这里的kvo也可以用于view和controller但不会是view和model,view不会有面向model的广播,view和controller会互相有广播。model广播非常好用,因为是不可见的,但也有限制,只能通知被允许通信的对象发生了什么事,现在我们有了各个阵营间所有的通信机制,我们要建立一个复杂应用。复杂应用不仅仅只有一个controller。view可能有100个controller至少有十几个控制很多的view,比如登录界面,点击了什么出个表,再点一下出来个其他的什么,各种各种的view被controller管理着,那要怎么做复杂应用呢?答案是把mvc组合 成mvc群,图上你们可以看到某些controller的view是另一个mvc,比如中间这个,它有3个mvc view,所以这很普遍,你在一个view里按下了个按钮,而另一个mvc显示了数据,这个图有个好的地方是,所有的箭头只通过规定的界限。你看其中任何一个部分,你明白这部分是干嘛的,一个model只有一个controller



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python小白的数学建模课-10.微分方程边值问题

小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文。 本文介绍微分方程模型边值问题的建模与求解,不涉及算法推导和编程,只探讨如何使用 Python 的工具包,…

千帆起航:探索百度智能云千帆AppBuilder在AI原生应用开发中的革新之路

千帆起航:探索百度千帆AppBuilder在AI原生应用开发中的革新之路 1.揭开帷幕,大模型第二次战役 自从 ChatGPT 横空出世后,一石激起千层浪,人工智能也正在从感知理解走向生成创造,这是一个关键里程碑。生成式大模型完成…

iOS开发里面的4个层次

iOS开发里面的4个层次ios开发具体体现为4个层次,你可以看我下面的思维导图。 Media 虽然是媒体层了,然而还是和硬件比较接近。 Core OS 主要是mach 4.x BSD UNIX 内核,也就是Mac OS 10操作系统,一个在硬件上能执行多任务的UNIX内核…

Python小白的数学建模课-12.非线性规划

非线性规划是指目标函数或约束条件中包含非线性函数的规划问题,实际就是非线性最优化问题。从线性规划到非线性规划,不仅是数学方法的差异,更是解决问题的思想方法的转变。非线性规划问题没有统一的通用方法,我们在这里学习的当然…

小程序真机如何清除订阅数据

在做小程序订阅消息开发的过程中发现,真机上如果是选择了‘总是保持以上选择’,一旦用户授权后,后面就不会再弹出申请改订阅消息的授权弹窗,这对于开发过程中是很不方便的。 曾试过清除缓存,重进小程序也不能清除掉 解…

Python小白的数学建模课-15.图论的基本概念

图论中所说的图,不是图形图像或地图,而是指由顶点和边所构成的图形结构。图论不仅与拓扑学、计算机数据结构和算法密切相关,而且正在成为机器学习的关键技术。本系列结合数学建模的应用需求,来介绍 NetworkX 图论与复杂网络工具包…

swift面向对象之属性

swift面向对象之属性 swift属性存储属性 可以存储常量和变量 惰性存储属性 语法:lazy var 变量 惰性存储属性只有在用的时候才会完成真正的初始化,刚开始的初始化代码只是类型占位,并没有分配存储空间。 比如 class people{ var name:Strin…

Python小白的数学建模课-16.最短路径算法

最短路径问题是图论研究中的经典算法问题,用于计算图中一个顶点到另一个顶点的最短路径。在图论中,最短路径长度与最短路径距离却是不同的概念和问题,经常会被混淆。求最短路径长度的常用算法是 Dijkstra 算法、Bellman-Ford 算法和Floyd 算法…

虚拟机(centos)磁盘空间不够

磁盘空间不够 1.关机 2.打开设置-->硬盘 --> 扩展 3.搞定一半 4.开机进入终端 4.1 查看 lsblk 4.2 加起来 growpart /dev/sda 3 注1: 如果 growpart 提示没有的话需要安装一下 yum -y install cloud-utils-growpart 注2:3前面有个空格 4.3 再次…

swift面向对象之方法

swift面向对象之方法 1.下标方法 下标方法仅用于实例,可以在类,结构体,枚举中使用,作用简化类型中的访问方式,注意以下几点 下标方法属于三栖方法,可用于类,结构体和枚举 下标方法的格式为subsc…

Python小白的数学建模课-17.条件最短路径算法

条件最短路径问题,指带有约束条件、限制条件的最短路径问题。例如: 顶点约束,包括必经点或禁止点的限制; 边的约束,包括必经路段、禁行路段和单向路段;无权路径长度的限制,如要求经过几步或不超…

Python小白的数学建模课-18.最小生成树问题

Python小白的数学建模课-18.最小生成树问题 最小生成树(MST)是图论中的基本问题,具有广泛的实际应用,在数学建模中也经常出现。路线设计、道路规划、官网布局、公交路线、网络设计,都可以转化为最小生成树问题&#xf…

Css表格

Css表格 Css表格 css表格属性可以帮助你极大的改善表格的外观 1.表格内间距 2.折叠边框 border-collapse属性设置是否将表格边框折叠为单一边框: table { border-collapse:collapse; } 3.表格边框 下面的例子为table、th以及td设置了蓝色边框: …

Python小白的数学建模课-19.网络流优化问题

流在生活中十分常见,例如交通系统中的人流、车流、物流,供水管网中的水流,金融系统中的现金流,网络中的信息流。网络流优化问题是基本的网络优化问题,应用非常广泛。网络流优化问题最重要的指标是边的成本和容量限制&a…

Python小白的数学建模课-20.网络流优化案例

在实际工作和数模竞赛中,网络最大流问题、最小费用流问题和最小费用最大流问题都有很多延伸和推广的应用。本文介绍了常见的网络最大流问题、最小费用流问题的应用与推广,及其解题方法。本文选择多源多汇物流转运问题、多商品流问题案例,详细…

HTML文档类型

HTML文档类型 HTML5 <!DOCTYPE html> HTML4.01 <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”> XHTML1.0 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w…

Python小白的数学建模课-21.关键路径法

Python小白的数学建模课-21.关键路径法 关键路径法是基于进度网络模型的方法&#xff0c;用网络图表示各项活动之间的相互关系&#xff0c;获得在一定工期、成本、资源约束条件下的最优进度安排。NetworkX 提供了拓扑序列和关键路径的函数&#xff0c;但没有给出计划网络分析的…

swift面向对象之多态与继承

swift面向对象之多态与继承 1.多态 运行时多态 运行时多态的要点 1.要有继承关系的存在 2.子类要重写父类的方法 3.父类类型的引用指向子类实例 2.继承 1.继承的注意 继承可以用于类而不能用于结构体和枚举&#xff0c;继承也可用于协议 swift中不能使用多继承&#xff0c;oc中…

Python小白的数学建模课-22.插值方法

Python小白的数学建模课-22.插值方法 插值、拟合、回归和预测&#xff0c;都是数学建模中经常提到的概念&#xff0c;也经常被混淆。插值&#xff0c;是在离散数据的基础上补插连续函数&#xff0c;使得插值函数通过全部给定的离散数据点&#xff0c;多用于图像处理和缺失数据处…