zoukankan      html  css  js  c++  java
  • KVC

    什么是KVC?

      KVC说通俗点就是通过属性的名称(key)给这个属性赋值,或者通过属性的名称(key)获取该属性的名称. 换句话说就是通过属性的key给value赋值,或者通过属性的key获取value.

    除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。

    KVC的使用!

    比如有一个person类,该类@property一个name属性,我们在访问该类name属性时只需要

    Person * p = [[Person alloc]init];
    p.name = @"张三";
    

     使用KVC

    Person * p = [[Person alloc]init];
    //赋值
    [p setValue:@"张三" forKey:@"name"]; //取值 NSString * name = [p valueForKey:@"name"];

     不仅如此,KVC还可以访问私有属性,当我们给person类声明一个私有属性,是不被外界访问的.

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
        @private NSString * age;//私有属性
    }
    @property(nonatomic,copy)NSString * name;
    
    @end
    

     此时我们用p.age是访问不到该age属性的.我们用KVC就可以访问该属性以及修改该属性的值.方式同上name属性

     KVC中除了setValue forKey之外还有个setValueForKeyPath的方法(键路径访问),例如在上述person类中还有个boy类,boy类中有name属性

    Boy.h

    #import <Foundation/Foundation.h>
    
    @interface Boy : NSObject{
        NSString * name;
    }
    
    @end
    

     Person.h

    #import "Boy.h"
    
    @interface Person : NSObject{
        @private NSString * age;//私有属性
         Boy * boy;
    }
    @property(nonatomic,copy)NSString * name;
    
    @end
    

     main

    Person * p = [[Person alloc]init];
    //赋值
    [p setValue:@"男孩" forKeyPath:@"boy.name"]; //取值 [p valueForKeyPath:@"boy.name"];

    KVC访问可变容器类

    比如使用kvc访问可变数组

    [p mutableArrayValueForKey:@"arr"];
    

     KVC与字典

    Person * p = [Person new];
        p.name = @"明名字";
        p.sex = @"男";
        NSArray * arr = @[@"name",@"sex"];
        //把对应key所有的属性全部取出来
        NSDictionary* dict = [p dictionaryWithValuesForKeys:arr];
        
        NSDictionary* modifyDict = @{@"name":@"名字",@"sex":@"男"};
        //用key Value来修改Model的属性
        [p setValuesForKeysWithDictionary:modifyDict];
    

     在开发中应用最多的就是利用KVC访问私有属性成员变量.比如修改

    UITextField 占位符颜色类似等等场景

    [textField setValue:[UIColor grayColor] forKeyPath@"placeholderLabel.textColor"];
    

     配合KVO监听可变容器变化

    NSMutableArray * tempArr = [_p mutableArrayValueForKey:@"arr"];
    [tempArr addObject:@"1"];
    

    KVC可以触发KVO 





  • 相关阅读:
    没有找到MSVCR100.dll解决方法
    Python用subprocess的Popen来调用系统命令
    我是怎样成长为系统架构师的
    【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
    SQLite的SQL语法
    MVC中使用AuthorizeAttribute做身份验证操作
    windows知识点
    java实现第五届蓝桥杯斐波那契
    java实现第五届蓝桥杯绳圈
    java实现第五届蓝桥杯绳圈
  • 原文地址:https://www.cnblogs.com/baxiu/p/10431818.html
Copyright © 2011-2022 走看看