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点击打开链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值