首页 > 代码库 > KVC基本使用

KVC基本使用


首先,创建两个类。person类和book类。如图:

技术分享技术分享


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接着代码来将Main.h中

//
//  Created by 胡双飞 on 15/8/15.
//  Copyright (c) 2015年 HSF. All rights reserved.
//

/** (键/值编码)
 *  KVC的基本用法:以字符串的形式(关注属性的key)向对象发送消息,查找是否有存在setter
 *                  getter方法,假设不存在,查找_key或key的实例变量,能够设置值。

* 同一时候。通过kvc,也能够获取不存在getter方法的对象值。不须要对象指针 * 指向直接訪问。(能够设置对象属性的值。也能够获取对象属性的值) * 以下的数字和代码中的数字标识的代码样例一致。

* 1.通过 setValue: forkey: 来设置对象的值(单个设置).假设是int、float、BOOL等基本 * 数据类型时。要封装简单能够用 @ 来搞定。 * * 2.通过 valueForKey: 获取对象的值。 * * 3.通过 valueForKeyPath: 能够通过 英文的点 . 訪问到路径指向的值。 * * 4.通过valueForKeyPath:能够訪问存储到数组中的每一个对象的值,接受时也要用NSArray来接受 * * 5.通过setValue: forKeyPath: 也能够将訪问到路径上的实例对象设值 * * 6.通过dictionaryWithValuesForKeys:(NSArray *)keys 能够通过多个key获取属性值, * 并以key-value形式存放到字典中。

* * 7.setValuesForKeysWithDictionary:能够通过字典直接给多个属性设值,经常使用字典转模型中 * */ #import <Foundation/Foundation.h> #import "Person.h" #import "Book.h" //kvc和数组的基本关系 void kvcWithArray(); int main(int argc, const char* argv[]) { @autoreleasepool { //建立一个书类 Book* book = [[Book alloc] init]; book.name = @"西游记"; //建立人 Person* person = [[Person alloc] init]; person.name = @"pig"; person.book = book; //person.age = 5; //1.当是int,float,BOOL基本数据类型时。要进行封装. [person setValue:@5 forKey:@"age"]; NSLog(@"%zd", person.age); //2.通过valueForKey:取值将值从对象解析成NSInterager类型 NSInteger age = [[person valueForKey:@"age"] integerValue]; NSLog(@"%ld", age); //3.valueForKeyPath基本运算 (方式一) NSString* bn = [person valueForKeyPath:@"book.name"]; NSLog(@"%@", bn); //方式二 [person.book valueForKeyPath:@"name"]; NSLog(@"%@", person.book.name); //4.和数组的关系 kvcWithArray(); //5.通过setValue: forKeyPath: 方法来设置值。 Person* pn = [[Person alloc] init]; [pn setValue:@"xishi" forKeyPath:@"name"]; [pn setValue:@"25" forKeyPath:@"age"]; [pn setValue:@"春秋战国" forKeyPath:@"book.name"]; //取值 NSString* nameKeyPath = [pn valueForKeyPath:@"name"]; NSInteger ageKeyPath = [[pn valueForKeyPath:@"age"] integerValue]; NSString* bookKeyPath = [person valueForKeyPath:@"book.name"]; NSLog(@"名字 %@", nameKeyPath); NSLog(@"年龄 %zd", ageKeyPath); NSLog(@"书名字 %@", bookKeyPath); //6.dictionaryWithValuesForKeys: 的使用,能够将数据直接放到字典里。

@[ @"name" ,还能够放其它值] NSDictionary* dict = [pn dictionaryWithValuesForKeys:@[ @"age", @"name" ]]; NSLog(@"-------%@", dict); //7.setValuesForKeysWithDictionary:能够通过字典直接给多个属性设值。

Person* vkd = [[Person alloc] init]; [vkd setValuesForKeysWithDictionary:dict]; NSLog(@"名字 %@", vkd.name); NSLog(@"年龄 %zd", vkd.age); NSLog(@"书名字 %@", vkd.book.name); /* 2015-08-17 11:20:42.325 02-KVC[656:33512] 名字 xishi 2015-08-17 11:20:42.325 02-KVC[656:33512] 年龄 25 2015-08-17 11:20:42.326 02-KVC[656:33512] 书名字 (null) */ //这里输出结果中书名字为空,原因是我在第六中的字典中没有赋值。 //(1)用kvc时,能够少值,不能多值,假设多值会出现程序崩溃。

//(2)在字典转模型时, // 在模型类的.m文件,放上-(void)setValue:(id)value forUndefinedKey:(NSString *)key{} // 方式来处理,当你的值多时就会来到这种方法。而且能够通过获取多值的属性. } return 0; } void kvcWithArray() { Person* p = [[Person alloc] init]; p.name = @"tangsen"; p.age = 30; Person* p1 = [[Person alloc] init]; p1.name = @"sunwukong"; p1.age = 40; Person* p2 = [[Person alloc] init]; p2.name = @"shaheshag"; p2.age = 20; // 笨的方法将人名加入到数组中。

// NSMutableArray *names = [NSMutableArray array]; // for (Person *person in persons) { // [names addObject:person.name]; // } //(1)创建的三个人加到数组中. NSArray* persons = @[ p, p1, p2 ]; // 通过 valueForKeyPath, 取出persons数组中全部person对象的name属性值 NSArray* names = [persons valueForKeyPath:@"name"]; NSLog(@"%@", names); }



KVC基本使用