zoukankan      html  css  js  c++  java
  • UI进阶 KVO

    KVO:(Key-Value-Observer)键值观察者,是观察者设计模式的一种具体实现

    KVO触发机制:一个对象(观察者),监测另一对象(被观察者)的某属性是否发生变化,若被监测的属性发生的更改,会触发观察者的一个方法(方法名固定,类似代理方法)

    KVO使用步骤:

    1、注册观察者(为被观察者指定观察者以及被观察属性)


    2、实现回调方法

    
3、触发回调方法(被观察属性发生更改)

    4、移除观察者

     1 #import "ViewController.h"
     2 
     3 @interface ViewController ()
     4 /// 观察可变数组的改变情况(苹果官方文档不建议对数组进行观察)
     5 @property (nonatomic, strong) NSMutableArray *array;
     6 @end
     7 
     8 @implementation ViewController
     9 
    10 - (void)viewDidLoad {
    11     [super viewDidLoad];
    12     /**
    13      *  KVO 键值观察 是观察者设计模式
    14      */
    15     // 初始化数组
    16     self.array = [NSMutableArray array];
    17     self.array = [@[@"1"] mutableCopy];
    18     // 1、注册观察者
    19     // 参数1: 指注册 KVO 通知的对象。观察者必须实现 observeValueForKeyPath:ofObject:change:context: 以对被观察对象的改变做出响应。
    20     // 参数2:指相对于被观察者的属性,此值必须不能为 nil。
    21     // 参数3:定义的常量值的组合,这些值指定了在发出的观察通知中会包含哪些东西。不同的指定值会导致观察通知中包含的值不同。
    22     /**
    23      NSKeyValueObservingOptionNew  表示 change 字典中应该包含监听对象的新属性值
    24      NSKeyValueObservingOptionOld  表示 change 字典中应该包含监听对象的旧属性值,即改变前的值
    25      NSKeyValueObservingOptionInitial  如果设定了该值,在注册观察者的方法返回之前就会发送通知给观察者
    26      NSKeyValueObservingOptionPrior  使得被观察对象的值在改变之前和改变之后都会发送通知,而不仅仅是在改变之后发送一个通知
    27      */
    28     // 参数4:该值可以是任一数据值,会在 observeValueForKeyPath:ofObject:change:context: 中传递给 anObserver,也就是这个参数值与 observeValueForKeyPath:ofObject:change:context: 的 context 参数的值相等
    29     [self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew context:nil];
    30 }
    31 
    32 // 2、实现回调方法
    33 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    34     // 可以进行刷新UI的操作
    35     // keyPath 指相对于被监听对象 object 的键路径
    36     // object 指键路径 keyPath 所属对象,即被监听对象
    37     // change 描述被监听属性的变化信息
    38     // context 注册 KVO 时由监听者提供,见上面关于context 的描述
    39     NSLog(@"keyPath = %@", keyPath);
    40     NSLog(@"object = %@", object);
    41     NSLog(@"change = %@", change);
    42 }
    43 
    44 // 3、触发可变数组进行改变
    45 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    46     NSArray *subArray = @[@"2", @"3", @"4"];
    47     // 根据keyPath获取到可变数组对象
    48     // setArray 给可变数组对象设置数据
    49     [[self mutableArrayValueForKeyPath:@"array"] setArray:subArray];
    50     NSLog(@"========%@", self.array);
    51 }
    52 
    53 // 视图将要消失
    54 - (void)viewWillDisappear:(BOOL)animated {
    55     // 移除观察者
    56     [self removeObserver:self forKeyPath:@"array"];
    57 }
    58 
    59 @end

     参考博客:http://blog.csdn.net/CaryaLiu/article/details/49256477#comments

  • 相关阅读:
    Java IO输入输出流 FileWriter 字符流
    Java IO输入输出流File 字节流
    Java List集合和Map集合的综合应用
    表单提交中的重复问题(表单令牌验证)
    php中const与define的区别
    阿里云中获取文件及目录列表的方法
    巧用php中的array_filter()函数去掉多维空值
    文件大小格式化函数
    UTC 通用格式时间 转换为 时间戳,并格式化为2017-01-01 12:00:00
    关于匿名函数的使用,购物车中计算销售税的应用
  • 原文地址:https://www.cnblogs.com/fearlessyyp/p/5510937.html
Copyright © 2011-2022 走看看