iOS开发之KVC,KVO

2017-07-29  本文已影响0人  tangbin583085

第一次写简书

    在简书上学到很多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);

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

上一篇下一篇

猜你喜欢

热点阅读