KVO键值监听:

Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

使用方式:

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察

上代码之前向大家说几个小坑,小白可以看,大神直接略过。

kvo直接监听NSMutableArray的时候,大家可能都认为count属于它的一个属性,当直接修改它的时候,count会发生变化,直接调用回调方法,事实上,kvo是无法直接监听count属性的,会直接崩溃,原因就不具体说了。怎么解决呢?我们可以新建一个model 来储存我们需要观察的NSMutableArray。好了,开始上代码;

新建 KVOModel.h

@interface KVOModel : NSObject

@property(nonatomic,strong)NSMutableArray *dataArray;

@end

ViewController中导入KVOModel.h

@property(nonatomic,strong)UITableView *tableView;

@property(nonatomic,strong)KVOModel *model;

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

[self cteateUI];

[self loadDatasorce];

[self createBtn1];

[self createBtn2];

}

-(void)createBtn1{

UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];

[btn setTitle:@"change1" forState:UIControlStateNormal];

btn.frame=CGRectMake(0, 0, 50, 44);

[self.view addSubview:btn];

[btn addTarget:self action:@selector(click1:) forControlEvents:UIControlEventTouchUpInside];

}

-(void)createBtn2{

UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];

[btn setTitle:@"change2" forState:UIControlStateNormal];

btn.frame=CGRectMake(414-50, 0, 50, 44);

[self.view addSubview:btn];

[btn addTarget:self action:@selector(click2:) forControlEvents:UIControlEventTouchUpInside];

}

-(void)click1:(UIButton*)sender{

[[self.model mutableArrayValueForKey:@"dataArray"] addObject:[NSString stringWithFormat:@"%u",arc4random()%100-1]];

}

-(void)click2:(UIButton*)sender{

//数组进行删除的时候要使用kvc的方式

[[self.model mutableArrayValueForKey:@"dataArray"] removeLastObject];

}

-(void)cteateUI{

self.tableView=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];

self.tableView.delegate=self;

self.tableView.dataSource=self;

[self.view addSubview:self.tableView];

}

-(void)loadDatasorce{

self.model=[[KVOModel alloc]init];

[self.model addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

self.model.dataArray=[NSMutableArray new];

for (NSInteger i=0;i<10; i++) {

//数组进行添加的时候要使用kvc的方式

[[self.model mutableArrayValueForKey:@"dataArray"] addObject:[NSString stringWithFormat:@"%ld",i]];

}

}

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

{

if ([keyPath isEqualToString:@"dataArray"]) {

// KVOModel * kvoModel=(KVOModel *)object;

// if (kvoModel.dataArray.count>=10) {

[_tableView reloadData];

// }

}

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

return 30;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return  self.model.dataArray.count;

}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cellid"];

if (!cell) {

cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellid"];

}

cell.textLabel.text= self.model.dataArray[indexPath.row];

return cell;

}

//移除观察者

-(void)dealloc{

if (_model != nil) {

[_model removeObserver:self forKeyPath:@"dataArray"];

}

}

上机测试,ok,增加,删除都会触发tableview的刷新。

ios 利用kvc 监听可变数组变化的更多相关文章

  1. 利用DOMNodeInserted监听标签内容变化

    var exeFlag = 0;//控制执行业务次数标记$('#list1').bind('DOMNodeInserted', function () { if(!/img/.test($(" ...

  2. KVC和KVO实现监听容器类(数组等)的变化

    KVC,即Key-Value Coding,键值编码,简单地说,就是可以由key获取一个object对应的property.举个例子,如果一个对象object,它有一个属性item,你可以通过valu ...

  3. iOS: 使用KVO监听控制器中数组的变化

    一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...

  4. 详解vuex结合localstorage动态监听storage的变化

    这篇文章主要介绍了详解vuex结合localstorage动态监听storage的变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 需求:不同组件间共用同一数据,当一个 ...

  5. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  6. 前端组件化Polymer入门教程(6)——监听属性值变化

    监听属性值变化 如果需要监听属性值变化可以通过给observer赋值一个回调函数. <say-Hello></say-Hello> <dom-module id=&quo ...

  7. MutationObserver 监听DOM树变化

    1 概述 Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API.为什么要使用mutation observer 去代替 ...

  8. HTML5 oninput实时监听输入框值变化的完美方案

    在网页开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理组合快 ...

  9. 【转载】实时监听输入框值变化的完美方案:oninput & onpropertychange

    oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有 ...

随机推荐

  1. makefile 使用【转载】

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...

  2. Hive安装&nbsp;&nbsp;&nbsp;&nbsp;…

    Hive安装 mysql使用主机(win7)上的mysql数据库,启动后,要关闭360和win7自带的防火墙,确保在虚拟机里能拼通主机********************************* ...

  3. Parallel类

    Parallel类是对线程很好的一个抽象.该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性. Parallel类定义了并行的for和foreach的静态方法.Pa ...

  4. js上传文件到后台时序列化数据

    let fd = new FormData() // 定义传递的序列化对象,for (let i = 0; i < addArr.length; i++) { // addArr是选中文件的输入 ...

  5. npm ERR! Cannot read property 'match' of undefined 错误处理

    跟往常一样运行npm install 的时候,突然报错.错误情况如下: npm ERR! Cannot read property 'match' of undefined npm ERR! A co ...

  6. Java基础--基本规则、语法

    一.关键字.保留字.标识符.常量.变量 1.关键字:使用某种语言赋予特殊含义的单词. 2.保留字:没有赋予特殊含义,但以后可能会使用的单词. 3.标识符:自定义的单词,以数字.字母.下划线以及$符组成 ...

  7. Java无模板导出Excel,Apache-POI插件实现

    开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...

  8. 基于SSM搭建网站实现增删改查

    网站源码地址:https://github.com/MyCreazy/BasicOperateWebSite.git 使用maven搭建网站的时候,记得选用war包格式,有时候maven包没有引用进来 ...

  9. Python小世界:彻底搞懂Python一切皆对象!!!

    前言 犹记得当初学习Python的时候,对于Python一切皆对象很是懵逼,因为Python是面向对象的动态型语言,而在函数及高阶函数的应用中,如若对于一切皆对象不是有很透彻的了解,基础不是那么牢固的 ...

  10. JSP 不同版本(转)

    转自 http://blog.csdn.net/sunnyyoona/article/details/51076823