首页投稿(暂停使用,暂停投稿)程序员iOS 开发

iOS KVC的几种情况简析

2016-05-09  本文已影响1060人  magicMushroom

kvc取值时,需注意的几点问题;

讲解一下kvc各种问题,包括基础属性赋值,属性对象的属性赋值,私有属性赋值

以及NSUserDefaults单例对象取值是用到的kvc取值(算特殊的),赋值与普通对象的有点不同。

首先

person类中.h文件

#import

#import"Student.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的强大。

希望能帮助到各位看官。

上一篇下一篇

猜你喜欢

热点阅读