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

  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/fearlessyyp/p/5510937.html
Copyright © 2011-2022 走看看