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
{
@private
int _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:@() forKeyPath:@"dog.price"];
#pragma mark 给私有成员变量赋值
[p setValue:@"lnj" forKey:@"_name"];
[p setValue:@() 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":@()
}
};
// 注意点:
// 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 = ;
p.dog = [Dog new];
p.dog.name = @"wangcai";
p.dog.price = ;
有以下几种方式取值
#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 = ;
Person *p2 = [Person new];
p2.name = @"ls";
p2.money = ;
Person *p3 = [Person new];
p3.name = @"ww";
p3.money = ;
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);
iOS开发——UI基础-KVC的更多相关文章
- iOS开发UI篇—Kvc简单介绍
ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- IOS开发UI基础--数据刷新
IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...
- iOS开发-UI基础Demo
现在更多的学习资料都是xCode4.X的,发现xCode6.1还是很多东西,如果有正在学习iOS开发的可以通过Demo简单了解下iOS的UI开发~ 1.新建单视图文件: 2.新建项目名称,语言选择OC ...
- iOS开发——UI基础-屏幕适配
一.适配 1.什么是适配?适应.兼容各种不同的情况 2.移动开发中,适配的常见种类 2.1系统适配 针对不同版本的操作系统进行适配 2.2屏幕适配 针对不同大小的屏幕尺寸进行适配 二.点和像素 1.在 ...
- iOS开发——UI基础-控制器,IBAction和IBOutlet,UIView
第一个ios程序 @interface ViewController : UIViewController @property(nonatomic, weak)IBOutlet UILabel *la ...
- IOS开发UI基础之Plis文件-字典转模型
什么是plist文件? 在开发中直接将数据写在代码里面 不是一种合理的做法 如果数据经常改变 就需要经常翻开对应的代码进行修改 造成代码扩展性低 因此,可以考虑将经常变的数据放在⽂文件中进⾏行存储,程 ...
- IOS开发-UI基础-视图
//------------------------------UIWindow--------------------------// 1.UIWindow:是 UIView 的子类,用于管理.协调 ...
- iOS开发——UI基础-UIScrollView
一.UIScrollView使用的步骤 1.创建UIScrollView 2.将需要展示的内容添加到UIScrollView中 3.设置UIScrollView的滚动范围 (contentSize) ...
随机推荐
- PHP 数组(遍历)
数组定义$attr = array(); //定义一个空的数组$attr = array(1,2,3,4); //定义一个有值的数组$attr[0]="aa";$attr[1]=& ...
- Jint .net平台的javascript引擎
使用需求 有时候一段Javascript代码写的很棒,而我们又无法将之翻译成.net或翻译之成本很高的时候 我们就可以使用Jint引擎来运行Javascript代码,来得到我们想要的结果 或者上 ht ...
- IBatis学习
(1)建立 SqlMap.config文件 <?xml version="1.0" encoding="utf-8" ?> <sqlMapCo ...
- html img src base64
网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABId ...
- c#找不到类型或命名空间名称“Word”
c#找不到类型或命名空间名称“Word” 2012-10-10 11:17:33| 分类: VC#技术|举报|字号 订阅 using Word = Microsoft.Office.Inte ...
- Python学习之模块进程函数详解
今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...
- JavaScript学习笔记——数组
javascript数组数组是一个可以存储 一组 或是 一系列 相关数据 的 容器. 一.为什么要使用数组. (1)为了解决大量相关数据的存储和使用的问题. (2)模拟真是的世界. 二.如何创建数组 ...
- 重启nginx
在env/nginx/sbin目录下输入:nginx,即可重启
- URL中“#” “?” &“”号的作用
URL中"#" "?" &""号的作用 阅读目录 1. # 2. ? 3. & 回到顶部 1. # 10年9月,twit ...
- 【转】【Java】利用反射技术,实现对类的私有方法、变量访问
java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...