zoukankan      html  css  js  c++  java
  • ios

    • 首先创建Person分类
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) float height;
    
    
    
    @end
    
    
    • .m中不做任何事情

    • 控制器.m中

    
    #import "ViewController.h"
    #import "Person.h"
    @interface ViewController ()
    
    @property (nonatomic, strong) Person *per;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        Person * per = [Person new];
        per.name = @"zhangsan";
        per.height = 1.2;
        self.per = per;
        
        // kvo 为per.name添加观察者
        [per addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
        
        // kvo 为per.height添加观察者
        [per addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
        
    }
    
    
    • 只要监听的属性name 和 height的值发生了改变就会触发下面的方法
    
    /** 添加观察者必须要实现的方法 */
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
        /** 打印新老值 */
        // 从打印结果看 分别打印出了 name 与 height的新老值
        NSLog(@"old : %@  new : %@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
    //    NSLog(@"keypath :  %@",keyPath);
    //    NSLog(@"change : %@",change);
        
    }
    
    
    • 由于对person.name 以及height的属性都做了监听,只要触摸后属性的值发生改变就做得到通知触发通知方法 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context 则可以在其内部做你想要做的事
    
    /** 触摸改变per.name属性值 */
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
        self.per.name = @"helloworld";
        self.per.height = 3.3;
    }
    
    
    
    • 一定要记得移除
    
    
    /** 移除 */
    -(void)dealloc{
    
        [self.per removeObserver:self forKeyPath:@"name" context:nil];
        [self.per removeObserver:self forKeyPath:@"height" context:nil];
    
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    
    
    • 注意点:
      1. 为某个对象的某个属性添加观察者,最后一定要移除,否则可能会崩溃
      1. 实现方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context则只要监听的属性发生改变就会触发.
  • 相关阅读:
    [转]Win7 64位操作系统下配置PHP+MySql+Apache环境
    [转]你必须懂的 T4 模板:深入浅出
    [转]C#反射机制介绍
    [转]RDLC报表,纯文字内容,动态数据源 解决方案
    [转]关于C# 中的Attribute 特性
    [转]MVC中如何使用RDLC报表
    [转]关于用netbeans和xdebug调试php的配置
    1308论文相关时间
    [转].net 使用NPOI或MyXls把DataTable导出到Excel
    [转]MySQL安装总结:Start service没有响应(Win7 64位) 服务启动失败 1067 错误
  • 原文地址:https://www.cnblogs.com/adampei-bobo/p/5459850.html
Copyright © 2011-2022 走看看