使用KVC
KVC是Key Value Coding的简称,意思是键值编码,号称Cocoa的大招。它是一种可以直接通过字符串key(对象在名称)来访问或修改对象属性的机制。
使用
1.利用KVC可以随意修改一个对象的属性或者成员变量(私有的也可以修改)。
其中,key为被修改对象的名称或者其成员变量名称。
#import <UIKit/UIKit.h>
@interface MainTabBarController : UITabBarController
@end
@implementation MainTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
// ZTTabBar是自定义的tabBar,这里要修改系统空间为自定义tabBar
ZTTabBar *tabBar = [[ZTTabBar alloc] init];
// self.tabBar = tabBar; 这里会报错,原因tabBar为readonly,所以这里考虑使用KVC。
[self setValue:tabBar forKeyPath:@"tabBar"];
}
@end
2.KVC: forKey、forKeyPath的区别,建议使用forKeyPath
下面有两个示例类:
- Person类:name,age,dog及dogs四个属性;
- Dog类:name,number两个属性。
(这个人很喜欢养狗)
类:Person
.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) NSArray *dogs;
- (void)printHeight;
@end
.m
#import "Person.h"
@implementation Person
{
@private
double _height; // 身高
}
@end
类Dog
.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (nonatomic, copy) NSString *name; //名字
@property (nonatomic, assign) Int *number; //数量
@end
.m
#import "Dog.h"
@implementation Dog
@end
使用KVC修改属性:
- (void)testKVC
{
Person *p = [[Person alloc] init];
// 1.property
p.name = @"rose";
p.age = 20;
p.dog = [[Dog alloc] init];
p.dog.name = "旺财";
// 2.forkey
[p setValue:@"jack" forKey:@"name"];
[p setValue:@30 forKey:@"age"];
[p.dog setValue:@"旺福" forKey:@"name"];
//Person对象的私有变量_height,对两个key:height\_height,任意一个key都可以修改其属性。
//(对于height,KVC先从内存中寻找对应名为height的属性,如果找不到就会自动寻找_height,然后进行相应的修改)
[p setValue:@1.80 forKey:@"height"];
[p setValue:@1.85 forKey:@"_height"];
// 3.forKeyPath
// forKeyPath包含了forKey的功能,以后使用forKeyPath就可以了。
// forKeyPath可以利用‘ . ’运算符一层一层往下查找对象的属性
[p setValue:@"jack" forKeyPath:@"p.name"];
[p setValue:@30 forKeyPath:@"p.age"];
[p setValue:@"哈士奇" forKeyPath:@"dog.name"];
NSLog(@"%d %@", p.age, p.name);
}
3. KVC取值
- (void)useKVCGetValue
{
Person *p = [[Person alloc] init];
p.dog = [[Dog alloc] init];
[p setValue:@"妞妞" forKeyPath:@"dog.name"];
NSLog(@"%@", [p valueForKeyPath:@"dog.name"]);
}
4.KVC Tips
- (void)test
{
Person *p = [[Person alloc] init];
Dog *dog1 = [[Dog alloc] init];
dog1.name = @"中华田园犬"; // 看家还得看土狗
dog1.number = 3;
Dog *dog2 = [[Dog alloc] init];
dog2.name = @"哈士奇"; // 二货,这玩意不能多养
dog2.number = 1;
Dog *dog3 = [[Dog alloc] init];
dog3.name = @"柴犬";
dog3.number = 4;
Dog *dog4 = [[Dog alloc] init];
dog3.name = @"萨摩耶";
dog3.number = 3;
Dog *dog5 = [[Dog alloc] init];
dog5.name = @"黑背";
dog5.number = 3;
p.dogs = @[dog1, dog2, dog3, dog4, dog5];
1. tip1:取指定数组
// 取出dogs数组中每一个元素的name属性值,放到一个新的数组中返回
NSArray *dogNames = [p valueForKeyPath:@"dogs.name"];
2.tip2: @sum(求和),@avg(求平均数),更多tip请百度。
// 计算所有狗的个数
NSNumber *dogsNumber = [p valueForKeyPath:@"dogs.@sum.number"];
NSLog(@"%@", sumNumber);
}
总结
- key的值必须正确,如果拼写错误,会出现异常;
- valueForKey\ valueForKeyPath 方法根据key的值读取对象的属性,setValue:forKey:\ forKeyPath: 是根据key的值来写对象的属性;
- 推荐使用 valueForKeyPath \ setValue:forKeyPth;
- 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果重写了这个方法,就可以获取错误的key值。
使用KVC的更多相关文章
- Objective-C之KVC、KVO
1,KVC(键值编码) Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...
- KVC 和 KVO
KVC 键值编码 全称是Key-value coding,翻译成键值编码.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制. 1.通过key(成员变量的名称)设置 ...
- 11. KVC And KVO
1. KVC And KVO 的认识 KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...
- iOS开发系列--Objective-C之KVC、KVO
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
- IOS学习之初识KVC
什么是kvc? kvc (key-value coding )键值编码,是ios 提供的一种通过key间接的来访问对象属性的一直方式. 哪些类支持kvc操作? kvc的操作方法由NSKeyValueC ...
- KVC & KVO
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value Observing的简写,是键值观察的意思.那么我们能拿KV ...
- iOS - 详细理解KVC与KVO
详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...
- KVC&&&KVO
KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...
- OC KVC
OC KVC KVC 全称 key valued coding 键值编码 在说KVC之前应该简单的了解一下反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法. 对于任意 ...
- IOS开发之Bug--使用KVC的易错情况
1.其实某些角度而言KVC是一个破坏封装又暴力的做法,而我已经两次因为KVC而导致应用程序出现闪退的情况. 场景:1.使用KVC修改某一个UIView的属性,比如width. 2.在viewWi ...
随机推荐
- Objective-C /iphone开发基础:分类(category,又称类别)
在c++中我们可以多继承来实现代码复用和封装使程序更加简练.在objective-c中只能单继承,不能多继承,那么除了协议protocol之外,我们可以实现类似多继承的一个方法就是,分类(catego ...
- CSS表格固定列宽
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- nodejs 微信中使用file组件上传图片在某些机型上点击无反应
看下下面的代码: <form action="/" class="file_upload" method="post" enctype ...
- vagrant yii2 Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002]
开发环境:vangrant + LAMP 安装了yii2 advanced版本之后,通过url访问fornted 报数据库user表不存在,看了安装yii2 advanced的教程,里面说需要需要运行 ...
- PHP基础2
一.函数赋值问题 function add($num1,$num2=5){ echo $num1+$num2; } add(5,19); 二.global 全局变量 把变量加入到全局变量数组中 ...
- js获取jsp中的变量值
js获取jsp中的变量值,有两种方式: 1.jsp标签获取属性 var message = '<%=request.getAttribute("message")%>' ...
- 让C# Excel导入导出,支持不同版本的Office
问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误. 找不到Excel Com组件,错误信息如下. 未能加载文件或程序集“Microsoft.Office.Int ...
- vs2012找不到system web optimization命名空间
今天新装了vs2012,安装完成后,创建了一个mvc4应用程序,创建生成出现了几个错误.通过错误我们的解决方案就是去找引用不到的路径,如何在vs2012中实现呢? 在工具栏中找工具--库程序包管理器- ...
- centos 7下配置mysql+php(ThinkPHP)+nginx
最近在Linux平台上配置服务器部署网站(说多了都是泪!),记个笔记! 一.首先是在centos下安装mysql (参考博客) mysql yum库提供了一个简单的和方便的方法来安装和更新MySQL相 ...
- GNU iconv
GNU iconv 一.关键函数 1.iconv_open() iconv_open(DestinationCharsets, SourceCharSets) 2.iconv() [XSI] [Opt ...