第一次写简书
在简书上学到很多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"];
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并且提交新数据到服务器,无需再为每个修改项写处理函数。
补充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);
如有不对的地方,请大家指正!