博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS: 使用KVO监听控制器中数组的变化
阅读量:6072 次
发布时间:2019-06-20

本文共 3681 字,大约阅读时间需要 12 分钟。

一、介绍:

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

 

二、了解:

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

 

三、步骤:

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

#import 
@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
*)change context:(nullable void *)context;
//重写监听方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary
*)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
*)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 
@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
*)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
*)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

 

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

欢迎关注github:

 

转载地址:http://nvngx.baihongyu.com/

你可能感兴趣的文章
Linux下MEncoder的编译
查看>>
Xamarin使用ListView开启分组视图Cell数据展示bug处理
查看>>
Javascript中闭包(Closure)的探索(一)-基本概念
查看>>
spark高级排序彻底解秘
查看>>
ylbtech-LanguageSamples-PartialTypes(部分类型)
查看>>
福建省促进大数据发展:变分散式管理为统筹集中式管理
查看>>
开发环境、生产环境、测试环境的基本理解和区别
查看>>
tomcat多应用之间如何共享jar
查看>>
Flex前后台交互,service层调用后台服务的简单封装
查看>>
技术汇之物联网设备网关技术架构设计
查看>>
OSX10.11 CocoaPods 升级总结
查看>>
深入浅出Netty
查看>>
3.使用maven创建java web项目
查看>>
笔记本搜索不到某一AP广播的SSID,信道的原因
查看>>
基于Spring MVC的异常处理及日志管理
查看>>
MediaBrowserService 音乐播放项目《IT蓝豹》
查看>>
MySQL入门12-数据类型
查看>>
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>