KVC樣本,fineui線上樣本

來源:互聯網
上載者:User

KVC樣本,fineui線上樣本

KVC –key value Coding,可以讓我們通過索引值編碼的形式進行屬性值的賦值

參考蘋果官網的圖。。

1.KVC

定義一個Person類

.h檔案

   1:  #import <Foundation/Foundation.h>
   2:  
   3:  @interface Person : NSObject
   4:  {
   5:     NSString *name;
   6:  }
   7:   
   8:  @end

.m檔案

   1:  #import "Person.h"
   2:   
   3:  @implementation Person
   4:   
   5:  @end

 

通過普通的擷取屬性的方法是無法對name進行賦值和取值操作的,這種情況可以通過KVC來進行設定和取值

   1:  - (void)viewDidLoad {
   2:      [super viewDidLoad];
   3:      // Do any additional setup after loading the view, typically from a nib.
   4:     Person  person=[[Person alloc]init];
   5:      [person setValue:@"keith" forKey:@"name"];
   6:      NSLog(@"name is %@",[person valueForKey:@"name"]);
   7:  }
輸出: 2014-11-26 21:51:12.237 KVCtest[543:10453] name is keith

賦值用setValue:forKey:

取值用 valueForKey:

2.鍵路徑

如果類中包含其他的類怎麼辦呢,訪問這個類的屬性怎麼辦呢。可以使用setValue: forKeyPath: 和valueForKeyPath設定和擷取

如定義一個car

.h檔案

#import <Foundation/Foundation.h>@interface Car : NSObject{    NSString *carname;}@end

將Person的.h改成

#import <Foundation/Foundation.h>@class Car;@interface Person : NSObject{    NSString *name;    Car *hiscar;}-(id)init;@end

.m為

#import "Person.h"#import "Car.h"@implementation Person-(id)init{    if (self=[super init]) {        hiscar=[[Car alloc]init];    }    return self;}@end

這裡實現了car的執行個體化,如果不這麼做在索引值編程時候hiscar因為沒有初始化而出現無法賦值的情況

調用:

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    Person *person=[[Person alloc]init];    [person setValue:@"keith" forKey:@"name"];    [person setValue:@"QQ" forKeyPath:@"hiscar.carname"];    NSLog(@"name is %@,hiscar is %@",[person valueForKey:@"name"],[person valueForKeyPath:@"hiscar.carname"]);        /*或者這樣*/     Car *car=[[Car alloc]init];     [car setValue:@"BeiKy" forKey:@"carname"];     [person setValue:car forKey:@"hiscar"];    NSLog(@"name is %@,hiscar is %@",[person valueForKey:@"name"],[person valueForKeyPath:@"hiscar.carname"]);}
輸出結果

2014-11-26 22:45:47.392 KVCtest[1031:25564] name is keith,hiscar is QQ
2014-11-26 22:45:47.394 KVCtest[1031:25564] name is keith,hiscar is BeiKy


3.類型封裝和轉換

 

再次修改Person.h檔案

#import <Foundation/Foundation.h>@class Car;@interface Person : NSObject{    NSString *name;    Car *hiscar;    NSInteger age;//增加一個年齡類型是NSInteger}-(id)init;@end
 

 

那麼如何在設定的時候會發生什麼呢?

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    Person *person=[[Person alloc]init];    [person setValue:@"keith" forKey:@"name"];    [person setValue:@"QQ" forKeyPath:@"hiscar.carname"];    [person setValue:@"24" forKeyPath:@"age"];//為年齡賦值    NSLog(@"name is %@, is %@ old ,hiscar is %@",[person valueForKey:@"name"],[person valueForKey:@"age"],[person valueForKeyPath:@"hiscar.carname"]);}

結果是:

2014-11-26 22:56:08.873 KVCtest[1086:27956] name is keith, is 24 old ,hiscar is QQ

4.操作集合

 

在Person中添加一個otherPerson

#import <Foundation/Foundation.h>@class Car;@interface Person : NSObject{    NSString *name;    Car *hiscar;    NSInteger age;    NSMutableArray *otherPerson;}-(id)init;@end

屬性.@sum.屬性,還有@count,@avg,@max.@min

-(void)kvcCollection{    Person *person=[[Person alloc]init];    [person setValue:@"keith" forKey:@"name"];    Person *person1=[[Person alloc]init];    Person *person2=[[Person alloc]init];    Person *person3=[[Person alloc]init];    Person *person4=[[Person alloc]init];    NSMutableArray *others=[[NSMutableArray alloc]initWithObjects:person1,person2,person3,person4, nil];    NSInteger agenum=20;    for (Person *p in others) {        [self setage:p age:[[NSString alloc]initWithFormat:@"%ld",agenum++]];    }    [person setValue:others forKey:@"otherPerson"];    NSLog(@"other's age is %@",[person valueForKeyPath:@"otherPerson.age"]);    NSLog(@"the avg age is %@",[person valueForKeyPath:@"otherPerson.@avg.age"]);    NSLog(@"the sum age is %@",[person valueForKeyPath:@"otherPerson.@sum.age"]);    NSLog(@"the count person is %@",[person valueForKeyPath:@"otherPerson.@count.age"]);    NSLog(@"the min age is %@",[person valueForKeyPath:@"otherPerson.@min.age"]);    NSLog(@"the max age is %@",[person valueForKeyPath:@"otherPerson.@max.age"]);    }-(void)setage:(Person *)person age:(NSString *)age{    [person setValue: age forKey:@"age"];}

 

輸出

2014-11-26 23:51:00.180 KVCtest[1346:42300] other's age is (
    20,
    21,
    22,
    23
)
2014-11-26 23:51:00.183 KVCtest[1346:42300] the avg age is 21.5
2014-11-26 23:51:00.183 KVCtest[1346:42300] the sum age is 86
2014-11-26 23:51:00.184 KVCtest[1346:42300] the count person is 4
2014-11-26 23:51:00.184 KVCtest[1346:42300] the min age is 20
2014-11-26 23:51:00.184 KVCtest[1346:42300] the max age is 23

 

本文參考 容芳志部落格,感謝這位博友

著作權聲明:本文由http://www.cnblogs.com/keithmoring/原創,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者部落格連結,謝謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.