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);
}
}
/**
* 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
转载:
http://www.cnblogs.com/XYQ-208910/p/6096186.html点击打开链接
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
