一、介绍:

KVO是一种能动态监听到属性值的改变的方式,使用场景非常广泛,这里我只讲如何监听控制器ViewController中数组的变化。

二、了解:

首先我们应该知道KVO是不能直接监听控制器ViewController数组的变化的,需要将数组定义在模型中,然后控制器ViewController持有模型对象,通过该对象才能监听。

三、步骤:

<1>在控制器ViewController类中定义一个模型类Model,并在该类中声明一个可变的数组属性modelArray并进行懒加载,其实它最终就是作为控制器ViewController的数组使用;

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

/**
* 在控制器新定义一个模型类
*/
@interface Model : NSObject
/**
* 可变的数组
*/
@property (strong,nonatomic)NSMutableArray *modelArray; @end
#import "ViewController.h"

@implementation ViewController

@end

@implementation Model

/**
* 懒加载
*/
-(NSMutableArray *)modelArray{
if(!_modelArray){
_modelArray = [NSMutableArray array];
}
return _modelArray;
} @end

<2>在控制器ViewController中持有模型类Model的全局对象;

#import "ViewController.h"

@interface ViewController ()
/**
* 持有模型对象
*/
@property (strong,nonatomic)Model *model; @end

<3>用第2步创建的对象注册监听,监听属性就是数组modelArray,即modelArray作为keyPath值,注册方法为;

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
//注册KVO监听
[_model addObserver:self forKeyPath:@"modelArray" options:NSKeyValueObservingOptionNew context:nil];

<4>重写监听方法,监听值的变化;

- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context;
//重写监听方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"modelArray"]) {
NSLog(@"%ld",_model.modelArray.count);
}
}

<5>移除监听,最后释放内内存时需要把监听移除掉

-(void)dealloc{
[_model removeObserver:self forKeyPath:@"modelArray"];
}

<6>点击界面,模拟数据添加到数组中,添加方法必须是:- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    NSObject *obj = [[NSObject alloc]init];
[[_model mutableArrayValueForKeyPath:@"modelArray"] addObject:obj];
}

四、演示截图:(每点击一次,能够监听到数组个数增加1)

五、完整代码如下:

.h文件

//
// ViewController.h
// KVOTest
//
// Created by 夏远全 on 16/11/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end /**
* 在控制器新定义一个模型类
*/
@interface Model : NSObject
/**
* 可变的数组
*/
@property (strong,nonatomic)NSMutableArray *modelArray; @end

.m文件

//
// ViewController.m
// KVOTest
//
// Created by 夏远全 on 16/11/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "ViewController.h" @interface ViewController ()
/**
* 持有模型对象
*/
@property (strong,nonatomic)Model *model; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //1.创建模型对象
_model = [[Model alloc]init]; //2.注册KVO监听
[_model addObserver:self forKeyPath:@"modelArray" options:NSKeyValueObservingOptionNew context:nil];
} /**
* 3.重写监听方法
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ if ([keyPath isEqualToString:@"modelArray"]) { NSLog(@"%ld",_model.modelArray.count);
}
} /**
* 4.移除监听
*/ -(void)dealloc{
[_model removeObserver:self forKeyPath:@"modelArray"];
} /**
* 5.模拟往数组添加数据
*/
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSObject *obj = [[NSObject alloc]init];
[[_model mutableArrayValueForKeyPath:@"modelArray"] addObject:obj];
} @end @implementation Model /**
* 懒加载
*/
-(NSMutableArray *)modelArray{
if(!_modelArray){
_modelArray = [NSMutableArray array];
}
return _modelArray;
} @end

注明:本人原创,牛人可以路过,希望可以帮到小白,嘿嘿

iOS: 使用KVO监听控制器中数组的变化的更多相关文章

  1. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化

    采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...

  2. 监听localStorage中的数据变化

    问题描述:我们在js里面获取了某一个localstorage的值,但是后期它可能改变了,我们js只执行一遍没办法再次获取它的值,当然可以刷新页面获取,但如果是我们的但页面就不能刷新页面了,此时:我们可 ...

  3. js实时监听input中值的变化

    $(function(){ $('#inputid').bind('input propertychange', function() { // input 中的值 var params = $(th ...

  4. 在vue中使用watch监听对象或数组

    最近发现在vue中使用watch监听对象或者数组时,当数组或者对象只是单一的值改变时,并不会出发watch中的事件. 在找问题过程中,发现当数组使用push一类的方法时,会触发watch,如果只是单一 ...

  5. js 实时监听input中值变化

    注意:用到了jquery需要引入jquery.min.js. 需求: 1.每个地方需要分别打分,总分为100; 2.第一个打分总分为40; 3.第二个打分总分为60. 注意:需要判断null.&quo ...

  6. iOS地图 -- 区域监听的实现和小练习

    区域监听用到的方法 [self.mgr startMonitoringForRegion:region]; --> 开启区域监听,没有返回值,在代理方法中得到信息并且处理信息 注:该方法只有用户 ...

  7. 移动端(IOS)iframe监听不到 onscroll 事件

    问题描述: 我在一个页面A中有瀑布流,点击瀑布流中的图片需要进入到另外一个页面B,点击返回需要回到页面A中点击的位置,为了实现该效果所以在页面A中嵌入iframe,iframe指向页面B,页面B中同样 ...

  8. oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接

    oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接 oracle11g的监听配置文件中的program和env两个配置,必须干掉,客户端才能正常连接 or ...

  9. Fragment-如何监听fragment中的回退事件与怎样保存fragment状态

    一.如何监听Fragment中的回退事件 1.问题阐述 在Activity中监听回退事件是件非常容易的事,因为直接重写onBackPressed()函数就好了,但当大家想要监听Fragment中的回退 ...

随机推荐

  1. JAVA图片处理--缩放,切割,类型转换

    import java.io.*; import java.awt.*; import java.awt.image.*; import java.awt.Graphics; import java. ...

  2. 给iOS工程增加Daily Build

    给iOS工程增加Daily Build  前言 Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 "持续集成" 的一个实践.Daily Build 对于开发来说有 ...

  3. dtd语法之定义元素

    1.语法:<!ELEMENT 元素名 使用规则> 使用规则: l (#PCDATA) :表示内容为普通文本数据 l EMPTY :表示元素内容必须为空 l ANY :元素出现任意次,一般用 ...

  4. 不用逗号进行UNION

    ./download.php ...if($link){    //加密后ID$link = base64_decode(urldecode($link));$link_array = explode ...

  5. Stackoverflow架构

    Stackoverflow用的是.net开发的,用的缓存是Redis,Stackoverflow架构的演讲地址是:http://www.infoq.com/cn/presentations/archi ...

  6. Linux常用命令(持续更新中)

    cd 目录名 :进入某个目录 ls :列出当前目录的内容 locate 文件名/目录名:寻找文件.目录 find 目录名1 -name 文件名/目录名2 :在目录1中寻找目录2 whereis  文件 ...

  7. HDU 1114 完全背包+判断能否装满

    题意 给出一个存钱罐里的钱币重量 给出可能的n种钱币重量以及价值 求存钱罐中钱币的最小价值 若不可能另有输出 在裸的完全背包上加了一点东西 即判断这个背包能否被装满 初始化 dp[0]=0 其余的都使 ...

  8. 安装CentOS

    1. 用UltraISO,将CentOS写入U盘,然后将两个CentOS iso文件也拷贝到u盘中,由于u盘FAT32的限制,需要调整第一个iso文件的尺寸,剪切到4GB以内即可拷贝进u盘 2. 用u ...

  9. PHP / JavaScript / jQuery 表单验证与处理总结: 第①部分 PHP 表单验证与处理

    PHP VERSION = 5.3.10 一.关于 $_REQUEST PHP 文档关于 $_REQUEST 的说明: 说明 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组. ...

  10. 【Objective-C】Windows下Objective-C开发环境配置

    [Objective-C]Windows下Objective-C开发环境配置 ftp://ftpmain.gnustep.org/pub/gnustep/binaries/windows/   最近打 ...