zoukankan      html  css  js  c++  java
  • ios学习:kvo

     1 #import <Foundation/Foundation.h>
     2 
     3 //TWFXStuData类作为Model层里的类,用于管理数据
     4 @interface TWFXStuData : NSObject
     5 {
     6     NSString *Name;
     7     NSInteger Age;
     8 }
     9 
    10 @property (retain, nonatomic) NSString *schoolName;
    11 
    12 @end
    13 
    14 
    15 
    16 
    17 #import "TWFXStuData.h"
    18 
    19 @implementation TWFXStuData
    20 
    21 @end
      1 //
      2 //http://www.189works.com/article-103444-1.html
      3 //Kvo(Key Value Coding)是cocoa中用来设值或取值的协议(NSKeyValueCoding),跟java的ejb有点类似。
      4 //都是通过对变量和函数名进行规范达到方便设置类成员值的目的.它是Cocoa的一个重要机制,
      5 //它有点类似于Notification,但是,它提供了观察某一属性变化的方法,而Notification需要一个发送notification的对象,这样KVO就比Notification极大的简化了代码。
      6 //这种观察-被观察模型适用于这样的情况,比方说根据A(数据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用价值很高。
      7 //
      8 
      9 #import "TWFXViewController.h"
     10 
     11 @interface TWFXViewController ()
     12 
     13 @end
     14 
     15 @implementation TWFXViewController
     16 
     17 - (void)viewDidLoad
     18 {
     19     [super viewDidLoad];
     20     // Do any additional setup after loading the view, typically from a nib.
     21     
     22     //TWFXStuData 是一个存储数据的类,用来模拟model data
     23     stuData = [[TWFXStuData alloc] init];
     24     testCount = 1;
     25     
     26     
     27     //第一步: 注册 观察者
     28     //对于被观察者StuData来说,它并不知道谁在观察它
     29     //参数说明: 第一个参数Observer 指明观察者是谁
     30     //         第二个参数KeyPath 指明要观察的属性
     31     //         第三个参数option 可以选择观察键值的变化,如变化前后的值等
     32     //         第四个参数 context 需要传输的数据
     33     
     34     [stuData addObserver:self
     35               forKeyPath:@"Name"
     36                  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
     37                  context:nil];
     38     
     39     [stuData addObserver:self
     40               forKeyPath:@"Age"
     41                  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
     42                  context:nil];
     43     
     44     [stuData addObserver:self forKeyPath:@"schoolName" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
     45 }
     46 
     47 
     48 //第二步: 观察者实现变化方法,当被注册的属性发生变化时,该方法将会被调用
     49 //参数 ofObject : 被观察者. change : 被观察属性的变化,由注册时指定.  context:注册时指定的传输的数据
     50 -(void) observeValueForKeyPath:(NSString *)keyPath
     51                       ofObject:(id)object
     52                         change:(NSDictionary *)change
     53                        context:(void *)context
     54 {
     55     if ([keyPath isEqualToString:@"Name"])
     56     {
     57         self.outlet_Name.text = [stuData valueForKey:@"Name"];
     58     }
     59     else if ([keyPath isEqualToString:@"Age"])
     60     {
     61         //通过valueForKey得到的属性的值也是对象类型的
     62         self.outlet_Age.text = [NSString stringWithFormat:@"%@",[stuData valueForKey:@"Age"] ];
     63     }
     64     else if ([keyPath isEqualToString:@"schoolName"])
     65     {
     66         self.outlet_SchoolName.text = [stuData valueForKey:@"schoolName"];
     67     }
     68 }
     69 
     70 
     71 //第三步: 模拟被观察的属性的值发生变化
     72 - (IBAction)btnClick_ChangeName:(UIButton *)sender {
     73     
     74     [stuData setValue:[NSString stringWithFormat:@"LiMing %d",testCount] forKey:@"Name"];
     75     testCount ++;
     76     
     77     //改变属性值:方法1
     78     [stuData setValue:@"小学" forKey:@"schoolName"];
     79 }
     80 
     81 - (IBAction)btnClick_ChangeAge:(UIButton *)sender {
     82     
     83     //通过setvalue设置属性的值时,value必须是对象类型,系统在赋值时应该会转换类型
     84     [stuData setValue:[NSNumber numberWithInteger:testCount] forKey:@"Age"];
     85     testCount ++;
     86     
     87     //改变属性值:方法2 (对于Property有效)
     88     [stuData setSchoolName:@"中学"];
     89 }
     90 
     91 - (IBAction)btnClick_test:(UIButton *)sender {
     92     
     93     //改变属性值:方法3 (对于Property有效)
     94     stuData.schoolName = @"d大学";
     95 }
     96 
     97 
     98 
     99 //第四步:取消观察
    100 - (void)dealloc {
    101     
    102     //取消观察
    103     [stuData removeObserver:self forKeyPath:@"Name" context:nil];
    104     [stuData removeObserver:self forKeyPath:@"Age" context:nil];
    105     [stuData removeObserver:self forKeyPath:@"schoolName" context:nil];
    106     
    107     //释放
    108     [stuData release];
    109         
    110     [_outlet_temp release];
    111     [_outlet_Name release];
    112     [_outlet_Age release];
    113     
    114     [_outlet_SchoolName release];
    115     [super dealloc];
    116 }
    117 
    118 }
    119 @end
  • 相关阅读:
    Ext JS 6学习文档-第5章-表格组件(grid)
    Ext JS 6学习文档-第4章-数据包
    Ext JS 6学习文档-第3章-基础组件
    Ext JS 6学习文档–第2章–核心概念
    Ext JS 6学习文档–第1章–ExtJS入门指南
    Console命令详解,让调试js代码变得更简单
    使用Node.js+Socket.IO搭建WebSocket实时应用
    node.js应用--转载
    Node.js 究竟是什么?
    Hello, Unity!
  • 原文地址:https://www.cnblogs.com/zouzf/p/2874936.html
Copyright © 2011-2022 走看看