博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发UI之KVC(取值/赋值) - KVO (观察某个对象的某个属性的改变)
阅读量:5024 次
发布时间:2019-06-12

本文共 3035 字,大约阅读时间需要 10 分钟。

一. KVC : key value coding,通常用来给某一个对象的属性赋值

1. KVC赋值

// 1.1 创建人LDPerson *p = [[LDPerson alloc] init];self.person = p;// 1.2 创建狗LDDog *dog = [[LDDog alloc] init];// 1.3 将狗赋值给人[p setValue:dog forKeyPath:@"dog"];// 1.4 通过kvc给dog的weight属性赋值 \赋值时会自动找到人拥有的dog的weight属性[p setValue:@20.0 forKeyPath:@"dog.weight"];NSLog(@"books = %@", [p valueForKeyPath:@"dog.weight"]);[dog print];

2. KVC字典赋值

// 2.1 创建一个字典,person的属性为键,对应赋值NSDictionary *dict = @{
@"name": @"jack", @"age": @"10", @"height": @"1.65"};// 2.2 通过字典中的键找到person对象属性进行赋值[p setValuesForKeysWithDictionary:dict];NSLog(@"name = %@, age = %@, height = %@", [p valueForKeyPath:@"name"], [p valueForKeyPath:@"age"], [p valueForKeyPath:@"height"]);

3. 自定义字典

// 3.1 定义字典NSDictionary *dict1 = @{
@"name": @"jim", @"age": @"20", @"height": @"1.75", @"books": @[@{
@"price": @"100"}, @{
@"price": @"98"}, @{
@"price": @"200"}, @{
@"price": @"198"}], @"dog": @{
@"weight": @"45.89"}};// 3.2 kvc赋值[p setValuesForKeysWithDictionary:dict1];// 3.3 输出boos中存放的是字典NSLog(@"books = %@", [p valueForKeyPath:@"books"]);NSLog(@"dog.weight = %@", [p valueForKeyPath:@"dog.weight"]);// 3.4 遍历,让books中存放字典NSMutableArray *arrayM = [NSMutableArray array];for (NSDictionary *dict in [p valueForKeyPath:@"books"]) { LDBook *book = [LDBook bookWithDict:dict]; [arrayM addObject:book];}[p setValue:arrayM forKeyPath:@"books"];NSLog(@"books = %@", [p valueForKeyPath:@"books"]);

4. KVC取值

NSMutableArray *tempM = [NSMutableArray array];// 4.1 kvc取出出数组books中price的值for (LDBook *book in [p valueForKeyPath:@"books"]) {    [tempM addObject:[book valueForKeyPath:@"price"]];}NSLog(@"%@", tempM);// 4.2 kvc取出数组中price的最大值/最小值/平均值/个数NSLog(@"Max = %@", [[p valueForKeyPath:@"books"] valueForKeyPath:@"@max.price"]);NSLog(@"Min = %@", [[p valueForKeyPath:@"books"] valueForKeyPath:@"@min.price"]);NSLog(@"Avg = %@", [[p valueForKeyPath:@"books"] valueForKeyPath:@"@avg.price"]);NSLog(@"count = %@", [[p valueForKeyPath:@"books"] valueForKeyPath:@"@count.price"]);

二. KVO : Key Value OBserver (观察者)

通过KVO可以观察某一个对象的属性值发生改变

1. 给Person创建一个观察者,观察Person的name属性

[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

2. 修改Person的name的值

[p setValue:@"ldd" forKey:@"name"];
3. 当Person的name的值发生改变时,会回调

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

#pragma mark - 实现KVO回调方法/** *  当对象的属性发生改变会调用该方法 * *  @param keyPath 监听的属性 *  @param object  监听的对象 *  @param change  新值和旧值 *  @param context 额外的数据 */- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    NSLog(@"KeyPath = %@", keyPath);    NSLog(@"object = %@", object);    NSLog(@"change = %@", change);}

4. 当回调完成之后销毁观察者

/** *  销毁Person的观察者 */- (void)dealloc{    [self.person removeObserver:self forKeyPath:@"name" context:nil];}

 

转载于:https://www.cnblogs.com/Xfsrn/p/4842433.html

你可能感兴趣的文章
maven创建的项目中无法创建src/main/java 解决方案
查看>>
华为软件开发云测评报告二:代码检查
查看>>
集合1
查看>>
js 原生 ajax
查看>>
关键词 virtual
查看>>
建造者模式(屌丝专用)
查看>>
UVALive 4730 Kingdom +段树和支票托收
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
在Macos下完美解决Adobe Dreamweaver CC 2018 汉化及操作方法
查看>>
【转】 Newtonsoft.Json高级用法
查看>>
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
bug记录_signalr执行$.connnection.testhub结果为空
查看>>
【转】常用的latex宏包
查看>>
[TMS320C674x] 一、GPIO认识
查看>>