关于iOS开发,我们之前重点分析了Cocoa框架下的单例模式、委托模式和观察者模式,今天我们继续和南昌APP开发制作公司小编来学习iOS常用设计模式中的MVC模式。MVC模式是相当古老的设计模式之一,它最早出现在Smalltalk语言中。现在,很多计算机语言和架构都采用了MVC模式。
4.1 MVC 模式概述
MVC模式是一种复合设计模式,由“观察者”(Observer)模式、“策略”(Strategy)模式和“合成”(Composite)模式等组成。MVC模式由3个部分组成,如图所示,其中这3个部分的作用如下图所示。
MVC模式
模型。保存应用数据的状态,回应视图对状态的查询,处理应用业务逻辑,完成应用的功能,将状态的变化通知视图。
视图。为用户展示信息并提供接口。用户通过视图向控制器发出动作请求,然后再向模型发出查询状态的申请,而模型状态的变化会通知给视图。
控制器。接收用户请求,根据请求更新模型。另外,控制器还会更新所选择的视图并将其作为对用户请求的回应。控制器是视图和模型的媒介,可以降低视图与模型的耦合度,使视图和模型的权责更加清晰,从而提高开发效率。
对应于哲学中的“内容”与“形式”,在MVC模型中,模型是“内容”,它存储了视图所需要的数据,视图是“形式”,是外部表现方式,而控制器是它们的媒介。
4.2 Cocoa Touch 中的 MVC 模式
我们讨论的是通用的MVC模式,而Cocoa和Cocoa Touch框架中的MVC模式与传统的MVC模式略有不同,前者的模型与视图不能进行任何通信,所有的通信都是通过控制器完成的,如图所示。
Cocoa Touch的MVC模式
在Cocoa Touch框架的UIKit框架中, UIViewController 是所有控制器的根类,如 UITableViewController 、UITabBarController 和 UINavigationController 。 UIView 是视图和控件的根类,模型一般继承于 NSObject 的子类。
下面我们通过一个iOS的案例来分析Cocoa Touch中MVC模式的运作过程,这个案例的界面如图所示。
MVC案例界面
这里我们就不过多介绍案例的编写过程,而是直接看一下代码。打开MVCSample工程,其中包括 AppDelegate类、ViewController 类和Main.storyboard等文件。
AppDelegate 是应用程序委托对象, ViewController 是视图控制器,Main.storyboard是故事板文件。我们只看到了视图控制器,没有看到视图和模型。打开故事板文件,可以看到View Controller Scene如图所示。
View Controller Scene
打开View Controller,就可以看到View,其中直接使用了UIKit框架中的UIView,因此在MVCSample组中没有视图。此外,属于视图的还有Button和Text Field,它们是View的子视图。
那么,模型对象在哪儿呢?模型对象很特殊,其本质是视图的“数据”。Text Field输入的内容,Button上的标签,都可以说是模型,但是模型与视图一样,有的时候我们未必需要自己创建一个模型类。因此,我们做开发工作时,主要是编写视图控制器。下面我们看看视图控制器 ViewController 的代码:
由上述代码可见,我们为两个控件myButton和myTextField定义了两个输出口类型的属性。因为要通过控制器更新这些视图(控件也属于视图),所以我们需要把这些视图定义成输出口类型的属性。
此外,还定义了 myAction: 方法以响应myButton按钮的触摸事件。该方法的返回类型是动作事件,这说明该方法是可以响应控件事件的。
另外,还实现了 UITextFieldDelegate 协议,这样ViewController 就变成了UITextField控件的委托对象,它们之间的运作关系如图所示。
MVC案例运作图
如图所示,视图包含了myButton和myTextField两个控件。现在我们按照编号对图解释如下。
① 当用户触摸myButton的时候,会触发 ViewController 中的 myAction: 方法。
② 视图控制器会实现一些控件委托和数据源协议,这要看具体的控件。在此案例中, ViewController 实现了UITextFieldDelegate 协议,UITextFieldDelegate 中定义了一些响应 UITextField 事件的方法。
③ 视图控制器通过属性 myButton 和 myTextField 来改变控件的状态。
④ 模型对象可以通过通知机制来通知数据的变化。
⑤ 视图控制器可以保存一个模型成员变量或属性,并通过它们改变模型的状态。
本文仅限内部技术人员学习交流,不得作于其他商业用途。希望此文对广大技人员有所帮助。文章出自:南昌APP开发制作公司-百恒网络