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 @end13 14 15 16 17 #import "TWFXStuData.h"18 19 @implementation TWFXStuData20 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