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