start
前些天在iTunes U里面看到今年斯坦福更新了iOS7的课程,以前也看了部分不过也是由于各种原因,没有全部看完,所以打算这次顺着当美剧追了:P。
Cocoa Drawing Guide那个也还在长线更新着,只是最近项目有点紧张(奇葩吧年前居然还紧张了)哈哈,大坑还是要自己填,不过还是短线写点东西了,表示我还健在XDDDD
在cocoa上开发了一段时间以后对于第一课里面MVC涉及到的通信方法都有了一定的了解,刚好顺便就总结下了。
涉及到的通信模式
我们根据ppt的顺序来顺着理下MVC之间到底怎么通信的。
C→M
Controller到Model的话,那就是直接通信了,Controller是知道Model的所有东西的,所以Controller是可以直接跟Model通信的。这个就不列代码了,跟普通类用法是一样的。
C→V——Outlet
跟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到Controller的通信就有点不一样了,因为View是不知道到底它的Controller是啥的,但是这样的话,View需要通知他的Controller事件的发生的时候(点击事件之类的)怎么办呢?这就要用到Target-Action了。
Target-Action就是Controller在自己身上设了一个Target,让View需要通知Controller的时候,向他发送Action。
Target-Action平时用的比较多的也是在Interface Builder中Control拖拽,在Controller中创建。另外一种是通过setTarget:
和setAction:
方法来设置,例如:
1 | - (id)init |
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发生了变化,他需要通知Controller他变化了,这时候要怎么办呢?因为我们的Model是完全不知道他的Controller是啥的,并且也不知道到底有多少个Controller在使用他,这时候,我们用通知或者KVO来实现对Controller的通知。
Notification和KVO的通信方式是,Model自己架了一个电台,然后如果需要知道变化的Controller都可以自己支个收音机来收听Model的电台。
1 | // 发送广播 |
KVO使用addObserver:forKeyPath:options:context:
和removeObserver:forKeyPath:
方法来对Model的某个属性设置或者移除监听的对象。
end
以前一开始看到的时候都对MVC里面这些概念挺模糊的,现在再看的话,老头一说马上就知道用的是啥了,也就顺手整理下了,也方便以后自己看:P
最后欢迎大家订阅我的微信公众号 Little Code
- 公众号主要发一些开发相关的技术文章
- 谈谈自己对技术的理解,经验
- 也许会谈谈人生的感悟
- 本人不是很高产,但是力求保证质量和原创