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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值