iOS KVC的几种情况简析

作者: magicMushroom | 来源:发表于2016-05-09 19:51 被阅读1060次

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

    希望能帮助到各位看官。

    相关文章

      网友评论

        本文标题:iOS KVC的几种情况简析

        本文链接:https://www.haomeiwen.com/subject/ceherttx.html