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/原創,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者部落格連結,謝謝!