ios學習:kvo

來源:互聯網
上載者:User

 

 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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.