首先理清思路
kvc取值时,需注意的几点问题;
讲解一下kvc各种问题,包括基础属性赋值,属性对象的属性赋值,私有属性赋值
以及NSUserDefaults单例对象取值是用到的kvc取值(算特殊的),赋值与普通对象的有点不同。
首先
person类中.h文件
```
@interface Person :NSObject
@property(nonatomic,copy) NSString * name;
@property(nonatomic,assign) int age;
@property(nonatomic,strong)Student* stu;
@end
```
student类中.h文件
```
@interface Student :NSObject
@property(nonatomic,copy)NSString*name;
@property(nonatomic,copy)NSString*score;
@end
```
控制器中:调用touchesBegan: withEvent:方法,该方法作用是在点击屏幕后调用此方法
```
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{
Person*per = [Person new];
Student*stu = [Student new];
per.stu = stu;
[per setValue:@"jim"forKey:@"name"];
[per setValue:@18forKey:@"age"];
[per setValue:@"jimi"forKeyPath:@"stu.name"];
NSLog(@"%@ ---- %d ---- %@",per.name,per.age,per.stu.name);
}
```
运行结果:
```
2016-05-09 18:59:16.582 kvo[4141:277228] jim ---- 18 ---- jimi
```
1、首先定义Person 和Student类
设置基础属性,没什么好解释的;直接上代码,苹果规定的
```
[per setValue:@"jim"forKey:@"name"];
[per setValue:@18forKey:@"age"];
```
2、给属性对象的属性赋值
将对象的路径点出来,就需要使用setValue: forKeyPath:这个方法,但其实setValue: forKeyPath:这个方法可以包含setValue: forKey:这个方法,就是说setValue: forKeyPath:使用2种情况都能赋值成功,而setValue: forKey:只能赋值本类的属性。
```
[per setValue:@"jimi"forKeyPath:@"stu.name"];
```
4、给student私有属性赋值
学生类里的私有属性
```
#import"Student.h"
@implementation Student
{
int_test;
}
@end
```
注意:依旧是在控制器中,在最后面加了2句代码;
----------------------------
就这两句
```
[per setValue:@12forKeyPath:@"stu.test"];
NSLog(@"%d", [[per valueForKeyPath:@"stu.test"] intValue]);
```
-----------------------------
```
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{
Person*per = [Person new];
Student*stu = [Student new];
per.stu = stu;
[per setValue:@"jim"forKey:@"name"];
[per setValue:@18forKey:@"age"];
[per setValue:@"jimi"forKeyPath:@"stu.name"];
NSLog(@"%@ ---- %d ---- %@",per.name,per.age,per.stu.name);
[per setValue:@12forKeyPath:@"stu.test"];
NSLog(@"%d", [[per valueForKeyPath:@"stu.test"] intValue]);
}
```
运行结果:
```
2016-05-09 18:59:16.581 kvo[4141:277228] 12
2016-05-09 18:59:16.582 kvo[4141:277228] jim ---- 18 ---- jimi
```
值得注意的是:
```
[per setValue:@12 forKeyPath:@"stu.test"];
```
很多同学会遇到,怎么给属性对象的私有属性赋值,答案就在这里。
也有同学有疑问,就是私有属性没有点语法,于是就以为不能点出来,stu.test这句其实就是给计算机点出路径没有其他含义;
5、NSUserDefaults单例对象取值是用到的kvc取值、赋值与普通对象的不同。
NSUserDefaults的具体作用,简单解释下就是将用户的一些偏好设置,在用户做出改变后保存起来。
话不多说,上代码
5.1准备工作:用来保存2个switch的状态,记住密码与自动登录。
//获得路径
```
- (NSString*)getPath{
NSString*path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
path = [path stringByAppendingPathComponent:@"contacts.data"];
return path;
}
//保存用户登录信息
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
//设置值时注意用的是setBool:forKey:这个方法,而基本kvc没有这些具体的数据类型赋值、取值;
[defaults setBool:self.switch1.on forKey:@"switchAutoLogin"];
[defaults setBool:self.switch2.on forKey:@"switchRem"];
//如果用户记住密码
if(self.switch2.on) {
[defaults setObject:self.textFileldAccount.text forKey:@"name"];
[defaults setObject:self.textFieldPassWord.text forKey:@"password"];
}
```
下次登录时在- (void)viewDidLoad 方法中
```
NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
//取值
NSString*name = [defaults valueForKey:@"name"];
NSString*pass = [defaults valueForKey:@"password"];
//是否自动登录
BOOL res1 = [defaults boolForKey:@"switchAutoLogin"];
//是否记住密码
BOOL res2 = [defaults boolForKey:@"switchRem"];
```
特别注意:如果后面的boolForKey错用valueforkey:的话,取出来的值是完全不对的。如果想不起来的话根本不知道问题出在哪。
//最后一个问题使用kvc对数组里面的元素字典里面的key值对应的值取出来
```
NSArray *arr = @[@{@"name":@"jim"},@{@"name":@"jack"}];
NSArray *arr2 = [arr valueForKey:@"name"];
NSLog(@"%@",arr2);
运行结果(jim,jack)
```
建议这一段代码,可以自己用xcode实现一下,实现可以理解为,当kvc要赋值时,发现对象是一个数组,元素是字典,所以就循环遍历所有元素,并通过key值取出对应的Value.
看完上面的代码深深的感觉到KVC的强大。
希望能帮助到各位看官。