第二课:More Xcode and Swift, MVC

在应用程序中对象分为三类:Controller、Model、View。Controller表示的是控制器,主要负责业务逻辑的处理,是应用程序的核心与大脑。Model表示的是应用程序的实体,数据结构,主要用来提供数据。View表示的是应用程序的UI。

MVC设计模式概述

  • Model表示的是应用程序看起来是怎么一个样子。比如计算器应用程序,Model的作用就是用来计算(不是应用程序如何显示)。因此,我们所做的所有工作都围绕计算来进行,这也是计算器需要做的所有的工作。 Controller用来将Model表现在屏幕上面,View作为Controller的下属,用来表示界面上所有的我们所看到的东西–通用UI实体。Controller用来控制UI界面如何工作,Model则完全依赖于UI界面是如何工作的。

MVC之间的交互

Controller与Model的交互

  • controller可以直接与Model进行交互,Controller必须要知道Model的一切,并且它必须拥有与Model进行交互的所有能力。Controller可以没有限制的使用公有的API来与Model进行交互,Controller的工作就是通过View来将Model呈现给用户。

Controller与View的交互

  • 同样,Controller通过使用Outlet(IBOutlet)直接与View进行交互(Outlet的原理是通过在Controller类中定义指针变量,与View对象进行绑定,这样通过Outlet指针便可以找到对应的View对象)。

Model与View之间可以进行交互吗?NO!Never!

  • Model与View之间永远不可以进行交互。Model是100%的依赖于UI,而View赌侠ing是通用基础UI对象,它们不依赖于任何Model对象。因此,View对象不能直接与特定的Model对象进行交互。它们需要Controller为其进行转换Model对象。因此,不管Model与View还是View与Model之间都是无法直接进行交互的。

View与Controller的交互

  • View与Controller是可以进行交互的。需要注意,由于View对象是通用对象,它们对于Controller一无所知。因此在View与Controller进行交互的时候,需要使用一种绑定的方式(这种方式不需要View知道与谁进行交互)和一种结构严密的方式(View与Controller双方都能够同意使用此方式进行交互)。

  • 其中一种方式为target-action方式:Controller将自己作为target,并且处理由View发出的Action。例如点击按钮发出的Action、移动滑块发出的Action等。这样通过发出Action的方式,View不需要知道接收Action的是哪一个Controller,所有View知道的事情为自身发生了某些变化,之后发送Action给Target。

  • 另外一种方式为Delegate方式:有时候在View里面发生了一些事情,需要通知Controller发生了什么。例如滚动视图发生了滚动,需要通知Controller,来告诉Controller滚动视图发生了滚动等等。滚动视图自身拥有足够的逻辑来获取这些事件的发生,因此它可以通过代理告诉其他对象自身发生了什么事情(代理回调,通过定义自身的protocol来实现)。Delegate(代理)主要关注的有以下常见关键字:Will、Should、Did等与动作相关的操作。

  • 另外一种方式为特殊的Delegate方式为DataSource:View不能提供自身所需要显示的数据,更不能拥有那些数据(View仅仅用来显示数据,而不是保存数据,Model用来保存数据)。这里有一种特殊的Delegate称作DataSoure(数据源)。DataSource主要关注的有以下常见关键字:Count、RowNumber、Data等与数据相关的操作。

Model与Controller的交互

  • 有时候Model发生了变化,Controller需要知道这些变化。我们可以通过使用Notification&KVO来与Controller进行交互(Notification与KVO都是基于观察者模式的设计)。
    View可以通过使用notification来通知Controller,但是一般不会这样做,这可能违反了MVC设计原则。

附上一张图:
MVC结构图

Swift语法学习

Swift Programming Language已经从头到尾基本看了一遍,不过最新Swift1.2发布了,添加了一些新特性而没有来得及看。说一下做第一次作业所用到的知识。

I. 将String类型转换为Double类型:
NSNumberFormatter().numberFromString(text)!.doubleValue

II. 搜索字符串中是否包含一个字符串:

if let stringExistRange = display.text!.rangeOfString("str") {
    println("字符串\(display.text!)中包含有字串str,Range(位置)为:\(stringExistRange)")
} else {
    println("不存在str字串")
}

III. 作业源码请看本人github地址:Calculator,有什么建议大家可以尽情提,感激不尽 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值