iOS 中KVO的那点事
今天遇到点关于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];
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。