ios 利用kvc 监听可变数组变化
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 监听可变数组变化的更多相关文章
- 利用DOMNodeInserted监听标签内容变化
var exeFlag = 0;//控制执行业务次数标记$('#list1').bind('DOMNodeInserted', function () { if(!/img/.test($(" ...
- KVC和KVO实现监听容器类(数组等)的变化
KVC,即Key-Value Coding,键值编码,简单地说,就是可以由key获取一个object对应的property.举个例子,如果一个对象object,它有一个属性item,你可以通过valu ...
- iOS: 使用KVO监听控制器中数组的变化
一.介绍: KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化. 二.了解: 首先我们应该知道KVO是不能直接监听控制器Vi ...
- 详解vuex结合localstorage动态监听storage的变化
这篇文章主要介绍了详解vuex结合localstorage动态监听storage的变化,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 需求:不同组件间共用同一数据,当一个 ...
- Android监听手机网络变化
Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...
- 前端组件化Polymer入门教程(6)——监听属性值变化
监听属性值变化 如果需要监听属性值变化可以通过给observer赋值一个回调函数. <say-Hello></say-Hello> <dom-module id=&quo ...
- MutationObserver 监听DOM树变化
1 概述 Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API.为什么要使用mutation observer 去代替 ...
- HTML5 oninput实时监听输入框值变化的完美方案
在网页开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理组合快 ...
- 【转载】实时监听输入框值变化的完美方案:oninput & onpropertychange
oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有 ...
随机推荐
- lwip【5】 lwIP配置文件opt.h和lwipopts.h初步分析之二
如何去配置lwip,使它去适合不同大小的脚,这就是本贴的主题lwIP的配置问题.尤其是内存的配置,配置多了浪费,配置少了跑不了或者不稳定(会出现的一大堆莫名奇妙的问题,什么打开网页的速度很慢啊?什么丢 ...
- Windows平台Python编程必会模块之pywin32
在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了. 不过,python模块虽多,也不可能满足开发者的所有需 ...
- ACM-ICPC2018北京网络赛 Saving Tang Monk II(bfs+优先队列)
题目1 : Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 <Journey to the West>(also < ...
- windows如何定时关闭一个程序
方法一其实系统本身有这项功能的,打开记事本,将以下内容保存为.bat文件(将下面cmd.exe的名字改成你的音乐播放软件的exe名)@echo offTASKKILL /F /IM cmd.exe / ...
- jmeter+ant+jenkins实现自动化接口测试
一.安装前准备 1.JDK:jdk-8u121-windows-x64 2.jmeter工具:apache-jmeter-2.13 3.ANT工具:apache-ant-1.9.7-bin 4.jen ...
- List Control控件中及时捕获checkbox被选中的消息的解决方案
转自:http://blog.csdn.net/vycode/article/details/7345073 我的功能需求是:用户可以在List Control里添加item,当无选项被选中(即Che ...
- 2014-8-5 NOIP(雾)模拟赛
皇帝的烦恼(二分答案) Description 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职 ...
- JAVA之动态编译
通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚.感兴趣的大家可以 ...
- 理解SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时, ...
- Glassfish Cannot run program "/usr/libexec/StartupItemContext; error=2 , No such file or directory
临时处理办法 http://sohu.io/questions/3833214/jvm-failed-to-start-java-io-ioexception-cannot-run-program-u ...