知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。本文仅作为个人学习记录使用,欢迎在许可协议范围内转载或使用,请尊重版权并且保留原文链接,谢谢您的理解合作。如果您觉得本站对您能有帮助,您可以使用RSS方式订阅本站,这样您将能在第一时间获取本站信息。

start

前些天在iTunes U里面看到今年斯坦福更新了iOS7的课程,以前也看了部分不过也是由于各种原因,没有全部看完,所以打算这次顺着当美剧追了:P。

Cocoa Drawing Guide那个也还在长线更新着,只是最近项目有点紧张(奇葩吧年前居然还紧张了)哈哈,大坑还是要自己填,不过还是短线写点东西了,表示我还健在XDDDD

在cocoa上开发了一段时间以后对于第一课里面MVC涉及到的通信方法都有了一定的了解,刚好顺便就总结下了。

涉及到的通信模式

我们根据ppt的顺序来顺着理下MVC之间到底怎么通信的。

C→M

Controller to Model

Controller到Model的话,那就是直接通信了,Controller是知道Model的所有东西的,所以Controller是可以直接跟Model通信的。这个就不列代码了,跟普通类用法是一样的。

C→V——Outlet

Controller to View

跟Controller和Model类似,Controller可以直接与View进行通信的,这个通信是通过Outlet来实现的,这个在使用的时候经常使用Control拖拽实现在Controller中创建Outlet,Controller可以直接操作Outlet。

@property (weak) IBOutlet NSTextField *textField;

上面的代码在.h文件中创建了一个NSTextField的Outlet,通过Interface Builder关联到UI上的一个NSTextField以后,就可以对他进行操作了。

V→C——Target-Action

View to Controller

View到Controller的通信就有点不一样了,因为View是不知道到底它的Controller是啥的,但是这样的话,View需要通知他的Controller事件的发生的时候(点击事件之类的)怎么办呢?这就要用到Target-Action了。

Target-Action就是Controller在自己身上设了一个Target,让View需要通知Controller的时候,向他发送Action。

Target-Action平时用的比较多的也是在Interface Builder中Control拖拽,在Controller中创建。另外一种是通过setTarget:setAction:方法来设置,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (id)init
{
self = [super init];
if (self) {
[self.menuItem setTarget:self];
[self.menuItem setAction:@selector(myAction:)];
}
return self;
}

- (void)myAction:(id)sender
{
// do something
}

delegate

delegate

因为View不拥有他自己显示的数据,所以View需要从Controller中获取信息,这时候需要用到delegate,Controller自己是View的delegate,负责告诉View如何显示数据,这时候,Controller作为View的数据源,格式化Model中的数据给View进行显示。

Delegate就是把View要做的事情,委托给了他的delegate,也就是他的Controller,例如一个TableView在发生选中事件了,那他要怎么办,这时候他就会去问问他的delegate的意见了,另一种是DataSource类型的delegate,他会向View提供数据源,同样是TableView,他想要知道他有多少行数据,第XX行数据显示啥,这时候,TableView也会问他的delegate。

M→C——Notification & KVO

Model to Controller

那最后如果Model发生了变化,他需要通知Controller他变化了,这时候要怎么办呢?因为我们的Model是完全不知道他的Controller是啥的,并且也不知道到底有多少个Controller在使用他,这时候,我们用通知或者KVO来实现对Controller的通知。

Notification和KVO的通信方式是,Model自己架了一个电台,然后如果需要知道变化的Controller都可以自己支个收音机来收听Model的电台。

1
2
3
4
5
6
7
8
9
// 发送广播
[[NSNotificationCenter defaultCenter] postNotificationName:电台的名字 object:nil userInfo:广播内容];

// 开收音机
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(响应广播内容的方法:) name:电台的名字 object:收听谁的电台(nil表示所有人的这个电台我都收听)];
// 注意每次执行上面的代码,Controller都会开个收音机放着,如果执行了多次,那么每次收到通知,就会响应多次

// 另外在不需要收听的时候需要通过下面的代码关掉收音机,否则可能会引起程序crash,因为在[NSNotificationCenter defaultCenter]里面对每个收听者都有一个unsafe retian的引用,如果没关,到时候他还是会向你的对象发送消息,然后程序就挂掉了
[[NSNotificationCenter defaultCenter] removeObserver:self];

KVO使用addObserver:forKeyPath:options:context:removeObserver:forKeyPath:方法来对Model的某个属性设置或者移除监听的对象。

end

以前一开始看到的时候都对MVC里面这些概念挺模糊的,现在再看的话,老头一说马上就知道用的是啥了,也就顺手整理下了,也方便以后自己看:P

最后欢迎大家订阅我的微信公众号 Little Code

公众号

  • 公众号主要发一些开发相关的技术文章
  • 谈谈自己对技术的理解,经验
  • 也许会谈谈人生的感悟
  • 本人不是很高产,但是力求保证质量和原创