iOS KVC的几种情况简析

首先理清思路

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的强大。

希望能帮助到各位看官。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 1.1.3.使用通知传值 1.2.Segue使用 2. KVC&&KVO2.1.什么是KVC KVC - Key ...
    追赶时间阅读 446评论 0 0
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • KVC:Key Value Coding,键值编码,是一种间接访问实例变量的方法。 KVC 提供了一个使用字符串(...
    iOS小吴阅读 2,870评论 0 5
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    朽木自雕也阅读 1,546评论 6 1
  • KCV 其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value...
    TYM阅读 1,049评论 0 4