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

发布时间:2017-6-23 20:10:43 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"iOS: 使用KVO监听控制器中数组的变化 ",主要涉及到iOS: 使用KVO监听控制器中数组的变化 方面的内容,对于iOS: 使用KVO监听控制器中数组的变化 感兴趣的同学可以参考一下。

一、介绍:

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);    }

上一篇:Java解析网段下包含的所有IP地址
下一篇:工厂方法

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。