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
原文地址:https://www.cnblogs.com/zouzf/p/2874936.html