利用观察者模式在view和ControllerView之间传值

来源:互联网 发布:生意参谋数据分析 编辑:程序博客网 时间:2024/05/15 09:59

1.利用观察者模式在View和ControllerView之间传值

最近在学网络请求,因为要实现MVC模式,将View与Controller分开在俩个文件间写,这就涉及到了View和ViewController之间传值的问题,按照以前写UI的经验,完全可以用属性传值,但是经过自己的一番测试,发现都ViewController里数据请求到之后,我们已经建立了View的空间,可是View上铺的各种标签的值需要根据请求来的数据做出相应的改变,例如铺在View上的UIImageView需要加载图片等等,可能因为网速等原因,造成数据加载不上去等,这时候,可能就需要一个观察者来观察View里属性的变化,如果发生变化,则利用变化改变View上各种视图的值。相关操作见下代码:

在View的initWithFrame:方法里加代码一段

        [self addObserver:self forKeyPath:@"movie" options:NSKeyValueObservingOptionNew context:@"change"];
此处的代码可以理解为给self添加了一个观察者self,让后面的self观察前面的self里的movie属性,该处的move是从ViewController里打包传来的数据类,option参数对应的是你想要的是改变之后的值(New)还是改变之前的值(Old),context参数可以随意填一个字符串,没有搞明白他在干什么的时候用。然后,我们需要一个方法,来接收改变后的值,该方法就是:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
当move发生变化之后,则会调用上面这个方法,参数change是个字典,他的key ‘ new ’,对应的value便是movie属性变化后的值,然后将其拿来修改view里的视图便可。

其实这里使用观察者模式有点大才小用,因为movie的值在这个页面里只变化一次,观察者在观察一个频繁发生变化的对象的时候将有更大的用处,在这里感谢波哥对我的指点。

在最后别忘记在dealloc里对观察者进行销毁。(别让人家一直盯着呀)

- (void)dealloc{    [_movie release];    [self removeObserver:self forKeyPath:@"movie"];    [super dealloc];}

更好的解决方案是,重写movie的set方法:
- (void)setMovie:(Movie *)movie{    if (_movie == movie) {        return;    }    [_movie release];    _movie = [movie retain];    [self setData];}
setData里是通过属性修改View上的视图。


本人刚开始学IOS,以上观点有不同意见或者需改正的地方欢迎留言或者加qq 263506069一起商量学习。

0 0
原创粉丝点击