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