KVC

作者: foolish_hungry | 来源:发表于2018-06-14 18:41 被阅读0次

    原理:

    • valueForKey:
      1.访问器匹配:先寻找与key,isKey, getKey (实测还有_key)同名的方法,返回值为对象类型。
      2.实例变量匹配:寻找与key, _key,isKey,_isKey同名的实例变量
    • setValueForKey:
      1.存取器匹配:先寻找与setKey同名的方法,且参数要为一个对象类型
      2.实例变量匹配:寻找与key,_isKey,_key,isKey同名的实例变量,直接赋值。

    集合操作

    1. 获取数组中最大的值
    NSArray *a = @[@4, @84, @2];
    NSLog(@"max = %@", [a valueForKeyPath:@"@max.self"]);
    
    1. 获取数组中对象属性的最大值
    Transition *t1 = [[Transition alloc] init];
        t1.amount = 10;
        Transition *t2 = [[Transition alloc] init];
        t2.amount = 20;
        Transition *t3 = [[Transition alloc] init];
        t3.amount = 30;
        
        NSArray *a = @[t1, t2, t3];
        NSLog(@"max = %@", [a valueForKeyPath:@"@max.amount"]);
    

    还有 @max @min @avg @count @sum
    @max和@min在进行判断时,都是通过调用compare:方法进行判断,所以可以通过重写该方法对判断过程进行控制。

    字典转模型

    TYLModel 模型

    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, copy) NSString *icon;
    
        NSDictionary *dic = @{@"name": @"James", @"icon": @"33.png"};
        TYLModel *model = [[TYLModel alloc] init];
        [model setValuesForKeysWithDictionary:dic];
        NSLog(@"name = %@\n icon = %@", model.name, model.icon);
    

    内部实现原理

    NSDictionary *dic = @{@"name": @"James", @"icon": @"33.png"};
    TYLModel *model = [[TYLModel alloc] init];
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            [model setValue:obj forKey:key];
     }];
    NSLog(@"name = %@\n icon = %@", model.name, model.icon);
    

    修改系统控件内部属性(runtime + KVC) 参考

    eg: UIPageControl 图片修改 runtime 遍历出属性, 修改图片

    UIPageControl *pageControl = [[UIPageControl alloc] init]; 
     [pageControl setValue:[UIImage imageNamed:@"home_slipt_nor"] forKeyPath:@"_pageImage"];
     [pageControl setValue:[UIImage imageNamed:@"home_slipt_pre"] forKeyPath:@"_currentPageImage"];
    

    一些技巧

    1. 服务器返回 如 'id' 字段, 关键字, 或者找不到key的时候
    - (nullable id)valueForUndefinedKey:(NSString *)key;
    - (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
    
    1. 当通过KVC给某个非对象的属性赋值为nil时
      例如给name赋值为nil的时候,就可以重写setNilValueForKey:方法并表示name是空的。
    - (void)setNilValueForKey:(NSString *)key {
        if ([key isEqualToString:@"name"]) {
            [self setValue:@"" forKey:@”age”];
        } else {
            [super setNilValueForKey:key];
        }
    }
    

    相关文章

      网友评论

          本文标题:KVC

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