首页 > 学院 > 开发设计 > 正文

KVC示例

2019-11-14 19:49:35
字体:
来源:转载
供稿:网友

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.VEVb.com/keithmoring/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表