码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 中KVO的那点事

时间:2015-04-27 14:55:41      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

今天遇到点关于KVO小问题,纠结了半天.结果是出来了.

需求:监听UITableView数据的变化,一旦变化,就刷新UITableView.

很显然要用到KVO.数据是放到

@property (nonatomic, strong) NSMutableArray* data;

刚开始我是这么做的:

1,注册监听

- (void)viewDidLoad {

    [super viewDidLoad];

    //KVO监听data的变化

    [self addObserver:self forKeyPath:@"data" options:0 context:nil];

    

}

 2,重写:observeValueForKeyPath:ofObject:change:context:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    //刷新

    [self.tableView reloadData];

}

3,改变self.data的值...

[self.data addObject:[NSString stringWithFormat:@"你好"]];

 

4,结果:没有反应!!!!

弄了半天才发现少东西.在KVO中,有两种类型:手动通知与自动通知.上面的通知没有反应,是因为这是一个手动通知,所以在属性改变时要在前后分别加上这两个方法: willChangeValueForKey:,didChangeValueForKey:.在自动通知中,可以不用加这两个方法.

在第三部修改为以下方式,就OK了.

[self willChangeValueForKey:@"data"];

[self.data addObject:[NSString stringWithFormat:@"%d",indexPath.row]];

 [self didChangeValueForKey:@"data"];

 

具体原因,看文档.

当然了,如果在你的app中需要把某个属性的自动通知改成改成手动通知的奇葩需求的时候.也不是不行的.重写以下NSObject的这个类方法就ok了:

automaticallyNotifiesObserversForKey.biru:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{

  //将backgroundColor属性的自动通知变成手动通知

    if ([key isEqualToString:@"backgroundColor"]) {

        return NO;

    }

    return [super automaticallyNotifiesObserversForKey:key];

}

 

iOS 中KVO的那点事

标签:

原文地址:http://www.cnblogs.com/iOS771722918/p/4460010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!