2014年12月5日 星期五

[Objective-C] Key-Value-Coding

Key-Value-Coding 簡單的說,可以透過Key去存取物件中的屬性,
而Key均為字串(NSString),這樣說明可能有點難以理解,但是可以透過以下例子來了解。

例子1

先在Storyboard加入一個UILabel物件,並設定Outlet


@property (weak, nonatomic) IBOutlet UILabel *myLabel;

假設我們現在想設定他的text值,正常狀態下你可能會這樣做

    self.myLabel.text = @"我是Label";

我們去更改了myLabel裡面的text值,那假如利用Key-Value-Coding去做這件事要這樣寫

    [self.myLabel setValue:@"我是Label" forKey:@"text"];

設定key值為text的Value為我是Label,也就是說你物件底下的所有屬性都能透過這個方式來設定

更簡單的說明就是你 物件『.』 後面都是key


那這樣用.去設定就好了,幹嘛用這個這麼麻煩? 反過來取也可以,因此可以很方便地作處理一些事情

利用 Value forKey來完成,透過key來取得屬性

例子:假設現在有一堆UILabel,也設了一堆Outlet

@property (weak, nonatomic) IBOutlet UILabel *label1;
@property (weak, nonatomic) IBOutlet UILabel *label2;
@property (weak, nonatomic) IBOutlet UILabel *label3;
@property (weak, nonatomic) IBOutlet UILabel *label4;
@property (weak, nonatomic) IBOutlet UILabel *label5;

都想設定他們的Text值

    self.label1.text = @"HI";
    self.label2.text = @"HI";
    self.label3.text = @"HI";
    self.label4.text = @"HI";
    self.label5.text = @"HI";

這樣寫實在不是很酷,假設有N百個,寫到過年也寫不完

上面提到 物件『.』都能當key,如果能利用key來幫忙完成這件事有多好

這些label1~5都能夠用字串來當key取值,因為他是self底下的屬性
 
那就可以改成這樣寫
    for (int i = 1; i < 6; i++) {
        NSString *key = [NSString stringWithFormat:@"label%i",i];
        UILabel *label = [self valueForKey:key];
        label.text = @"hi";
    }

不過要注意的是透過valueForKey回傳的值是id,因此要創建物件去接收他,就可以使用了。



沒有留言:

張貼留言