iOS开发——UI基础-KVC
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。
如何使用KVC存取对象属性呢?看个示例
一、使用KVC存数据
定义一个person类
.h文件
#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject/** 姓名*/ @property (nonatomic, copy)NSString *name;/** 钱*/ @property (nonatomic, assign)double money;/** 宠物*/ @property (nonatomic, strong)Dog *dog; @end
.m文件
#import "Person.h"@implementation Person {@privateint _age; }- (void)say {NSLog(@"age = %i", _age); }@end
再定义一个dog类
.h
#import <Foundation/Foundation.h>@interface Dog : NSObject/** 狗的外号*/ @property (nonatomic, copy)NSString *name;/** 狗的价格*/ @property (nonatomic, assign)double price; @end
.m
#import "Dog.h"@implementation Dog@end
先创建一个对象
Person *p = [[Person alloc] init];
p.name = @"chg"; // setter
p.money = 998.0;
除了这种方式赋值,可以使用KVC
#pragma mark 单个值// KVC == KEY VALUE CODING// Value : 值, 只能传对象// forKey: 需要给谁(哪个属性)赋值// setValue:forKey:方法, 只能给对象的直接属性赋值[p setValue:@"lmj" forKey:@"name"];// @(998.0) == [NSNumber numberWithDouble:(double)][p setValue:@(668.0) forKey:@"money"];
#pragma mark 多层赋值p.dog = [Dog new];p.dog.name == [[p dog] setName:]p.dog.name = @"wangwang";p.dog.price = 110.0;// setValue:forKeyPath: 可以给对象的间接属性赋值. 多层赋值// 建议: 以后在开发中都使用setValue:forKeyPath:[p setValue:@"xiaoqiang" forKeyPath:@"dog.name"];[p setValue:@(110) forKeyPath:@"dog.price"];
#pragma mark 给私有成员变量赋值[p setValue:@"lnj" forKey:@"_name"];[p setValue:@(30) forKey:@"_age"];SEL sel = @selector(say);[p performSelector:sel];[p say];
#pragma mark 字典转模型NSDictionary *dict = @{@"name":@"xxx",@"money": @(998.1),// @"score":@(100)@"dog":@{@"name":@"wangcai",@"price":@(110)}};// 注意点:// 1.如果想使用KVC进行字典转模型, 那么字典中的key必须和模型中的属性一模一样(个数 + 名称)// this class is not key value coding-compliant for the key score.'// 2.如果使用KVC进行字典转模型, 只能对当前调用KVC方法的对象进行转换, 不能对它的属性的对象进行转换// setValuesForKeysWithDictionary:方法内部的实现原理// 1.会拿到字典中的key, 然后根据这个key取出字典中的值, 然后再根据这个key赋值给对象// [p setValue:@"xxx" forKey:@"name"]; [p setValuesForKeysWithDictionary:dict];NSLog(@"p.dog = %@", p.dog);NSLog(@"name = %@, money = %f", p.name, p.money); // getter
二、使用KVC取数据
首先设置一些数据
Person *p = [Person new];p.name = @"chg";p.money = 998;p.dog = [Dog new];p.dog.name = @"wangcai";p.dog.price = 110;
有以下几种方式取值
#pragma mark 获取单个值NSString *name = [p valueForKey:@"name"];NSLog(@"name = %@", name);double money = [[p valueForKey:@"money"] doubleValue];NSLog(@"money = %f", money);
#pragma mark 获取多层值NSString *dogName = [p valueForKey:@"dog.name"];NSString *dogName = [p valueForKeyPath:@"dog.name"];NSLog(@"dogName = %@", dogName);
#pragma mark 模型转字典NSDictionary *dict = [p dictionaryWithValuesForKeys:@[@"name", @"money"]];
#pragma mark 获取数组中对象的值Person *p1 = [Person new];p1.name = @"zs";p1.money = 111;Person *p2 = [Person new];p2.name = @"ls";p2.money = 222;Person *p3 = [Person new];p3.name = @"ww";p3.money = 666;NSArray *arr = @[p1, p2, p3];// 如果数组中的元素都是同一种类型的数据, 可以使用KVC获取数组中所有对象的某个属性的值NSArray *res = [arr valueForKeyPath:@"name"];NSLog(@"res = %@", res);
#pragma mark 运算符// 获取arr数组中money的平均值id res1 = [arr valueForKeyPath:@"@avg.money"];// 获取arr数组中money的最大值id res2 = [arr valueForKeyPath:@"@max.money"];// 获取arr数组中money的最小值id res3 = [arr valueForKeyPath:@"@max.money"];NSLog(@"res1 = %@,res2 = %@,res3 = %@", res1,res2,res3);
转载于:https://www.cnblogs.com/chglog/p/4666081.html
iOS开发——UI基础-KVC相关推荐
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础-手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- ios开发-UI基础-应用管理(单纯界面)
功能分析 以九宫格的形式展示应用信息 点击下载按钮后,做出相应操作(弹出一个提示"正在下载",相应应用的下载按钮变为"已下载") 步骤分析 搭建UI界面 加载应 ...
- iOS开发——UI基础-UIImage,UIImageView的使用
1.UIImage 创建UIImage的两种方法 UIImage *image = [UIImage imageNamed:imageNmae];UIImage *image = [UIImage i ...
- iOS开发UI篇—transframe属性(形变)
iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...
- iOS开发UI篇—实现UITableview控件数据刷新
iOS开发UI篇-实现UITableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...
- iOS开发UI篇—CALayer简介
iOS开发UI篇-CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UI ...
- iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
iOS开发UI篇-使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: 1 //2 // YY ...
- iOS开发UI篇-在UItableview中实现加载更多功能
iOS开发UI篇-在UItableview中实现加载更多功能 一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据. 二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时 ...
- android tableview实现多选功能,iOS开发UI篇-tableView在编辑状态下的批量操作(多选)...
先看下效果图 直接上代码 #import "MyController.h" @interface MyController () { UIButton *button; } @pr ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
最新文章
- Openssl私建CA
- VTK:PolyData之TriangleColoredPoints
- Hive常用的操作命令
- sqlite和java_Java和SQLite
- java的printf语法_Java中printf的用法总结
- UIButton设置圆角和边框
- 【模板】线段树(区间加)
- 业内对楼市回暖时间几成共识:尚需一年
- iOS设计模式之代理模式
- idea里查找maven的jar包冲突
- swagger2 配置访问路径_有了Swagger2 再也不用担心API文档的维护了
- c语言编程能力提高,C语言编程能力的培养
- 银行卡四要素实名验证,你知道多少?
- libcurl返回DNS无法解析的问题
- 和Ajax斗志斗勇的日子
- 移动端1px边框实现
- 台式机,在不能连网线的情况下,如何连接WiFi呢?
- must be unique: xxx.xxx.xxx:xxx:jar -> duplicate declaration of version 0.0.1 @ line 25, column 21
- 360html收藏夹,360浏览器的收藏夹如何保存?360浏览器收藏夹备份方法
- 动态gif图如何在线制作?gif动图制作在线如何操作?
热门文章
- 深刻反省:好的习惯必须坚持,不论心情怎样
- 娟红静敏,从女孩子名中可以看出什么
- NSString中如何正确判断包含一个变量字串NSString
- 线程令牌桶的实现及条件变量改进版本
- oracle 数据库用户配置,Oracle数据库安装配置示例
- java 快速创建map_快速创建Map并初始化,超级简单
- linux apache 依赖包,利用 yum 解决 Linux 软件包的依赖关系
- xshell左侧导航栏_Axure教程:(初级)导航中的页面切换
- java 取模运算_JAVA算术运算符_四则与取模
- 系统同传软件_语情快递 | 手语同传AI,你见过吗?