美文网首页
iOS开发之KVC,KVO

iOS开发之KVC,KVO

作者: tangbin583085 | 来源:发表于2017-07-29 20:43 被阅读0次

    第一次写简书

        在简书上学到很多iOS知识,今天第一次分享文章,希望以后自己有时间多总结,发布文章整理,利人利己。如有不对的地方,请大家指正!
    

    KVC

        KVC(key-value-coding),键值编码。说白了就是通过类属性的key获取其属性的value,而不用通过Setter,Getter,这个在开发中很实用。
    

    举个例子:
    Student 类有2个属性

    // 名字
    @property (nonatomic, copy)NSString *name;
    // 分数
    @property (nonatomic, assign)float score;
    
    

    设置Student值,2种方法可达同样效果

        Student *student1 = [[Student alloc] init];
        student1.name = @"zhangsan";
        student1.score = 100;
        
        Student *student2 = [[Student alloc] init];
        [student2 setValue:@"lisi" forKeyPath:@"name"];
        [student2 setValue:@99 forKeyPath:@"score"];
    

    开发中常用的案例:
    1,替换UITabBarController的tabBar

        // 更换tabBar
        [self setValue:[[MyTabBar alloc] init] forKeyPath:@"tabBar"];
    
    B3657847A5C6DD1DE909A375F7597F73.jpg

    2,设置UITextField占位符的颜色,Font

        [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
        [textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];
    

    KVC,用处很大,功能很强大,有兴趣的可以继续深入研究。

    KVO

        KVO(key-value-observing),建立在KVC,利用类属性key监听其值的变化。说白了,就是属性值一旦有变化就通知观察者。
    

    使用步骤:
    1,注册监听
    2,设置监听事件(如zhangsan的score成绩一旦变化就告诉他妈)
    3,注销监听
    以上面的student1对象实例为例:

    // 监听
    [student1 addObserver:self forKeyPath:@"score" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    
    // 监听这个方法回调
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
        // 在这个方法里面监听属性变化,如zhangsan的score成绩一旦变化就告诉他妈咪 O(∩_∩)O~
        
    }
    
    - (void)dealloc{
        // 注销
        [self.student1 removeObserver:self forKeyPath:@"score"];
    }
    

    常用开发案例
    1,监听UITableVIew的contentOffset,根据表格偏移量轻松改变navigationBar的位置,颜色等设置

      [tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
    

    2,一般APP都有编辑个人信息页面,利用KVO监听用户编辑的信息即刻更新UI并且提交新数据到服务器,无需再为每个修改项写处理函数。


    8B01CF602F8C0B5F5CF4E3A67A20CCC8.jpg

    补充KVC可以放R大招
    你还在用for循环计算集合数据的总数,平均值?那你就out了,Q,W,E,R直接搞掂。

        Student *student1 = [[Student alloc] init];
        student1.name = @"zhangsan";
        student1.score = 100;
        
        Student *student2 = [[Student alloc] init];
        [student2 setValue:@"lisi" forKeyPath:@"_name"];
        [student2 setValue:@99 forKeyPath:@"score"];
        
        Student *student3 = [[Student alloc] init];
        [student3 setValue:@"wangwu" forKeyPath:@"_name"];
        [student3 setValue:@71 forKeyPath:@"score"];
        
        
        Teacher *teacher = [[Teacher alloc] init];
        teacher.name = @"Miss Lu";
        teacher.studentArray = [NSMutableArray array];
        [teacher.studentArray addObject:student1];
        [teacher.studentArray addObject:student2];
        [teacher.studentArray addObject:student3];
        
        // 平均分数
        NSNumber *avgSccore = [teacher valueForKeyPath:@"studentArray.@avg.score"];
        NSLog(@"%@", avgSccore);
        
        // 总分
        NSNumber *totalScore = [teacher valueForKeyPath:@"studentArray.@sum.score"];
        NSLog(@"%@", totalScore);
        
        // 最低分,最高分
        NSNumber *min = [teacher valueForKeyPath:@"studentArray.@min.score"];
        NSLog(@"%@", min);
        NSNumber *max = [teacher valueForKeyPath:@"studentArray.@max.score"];
        NSLog(@"%@", max);
        
        // 求同学数量
        NSArray *studentCount = [teacher valueForKeyPath:@"studentArray.@count"];
        NSLog(@"%@", studentCount);
        
        // 获取所有同学的分数
        NSArray *sccoreArray = [teacher valueForKeyPath:@"studentArray.score"];
        NSLog(@"%@", sccoreArray);
    

    如有不对的地方,请大家指正!

    相关文章

      网友评论

          本文标题:iOS开发之KVC,KVO

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