UI:KVO、KVC
什么是KVC 什么是 KVO ?
KVC:(NSKey ValueCoding)”键-值 编码“是一种间接的访问对象属性(字符串表征)的机制。对象的属性都可以通过使用KVC机制用相同的方式访问。我们可以取而代之“设置器方法、点语法方法”去访问对象的属性。
KVO:(NSKey ValueObserving)"键-值 监听"是一种这样的机制,当对象的属性发生变化的时候,我们的监听者能够得到一个通知。
NSObject 类为所有的对象提供了一个自动检测能力的NSKey ValueObserving 协议。我们可以根据需要来打开这个监听机制。KVO是基于KVC而实现的。
KVC & KVO的使用
在使用KVC的时候,我们要注意,key 必须以小写字母开头,通常常和系统访问器方法同名。
获取属性:valueForKey:
设置属性:setValue: forKey:
KVC 对未定义的属性定义了 valueForUndefinedKey: 方法(重载方法获取定制的实现)
注意:KVC中的 value 都必须是对象。
基于KVC能够对对象的属性进行访问,当这个属性发生变化的时候,我们也能监听,这个监听的方法系统已经为我们实现了。我们所做的只需要去注册这个监听。注册之后就能很好的监听,属性的值变化了。下面就是KVO机制的注册和监听方法
1注册
-(void)addObserVer:(NSObject*)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
方法参数说明:keyPath 就是要观察的属性值,options 就是观察键值变化的选择 ,context 就是我们要传输的数据。其中options 是监听返回的字典所包含什么值。有两个常用的选项:NSKeyValueObservingOptionNew 返回的字典包含新值 NSKeyValueObservingOptionOld 指返回的字典包含旧值。
2.监听
-(void)obserValueForKeyPath:(NSString *)KeyPath ofObject(id)object change:(NSDictionary *)change context:(void *)context
其中 change 里存储了一些变化的数据,比如变化前的数据,变化后的数据。
实例代码:
———————————————————————————————————————————————(.m文件) #import "AppDelegate.h"
#import "ViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
ViewController * vc = [[ViewController alloc]init];
self.window.rootViewController = vc;
return YES;
}
Appdelegate文件
———————————————————————————————————————————————(.h文件) #import <Foundation/Foundation.h> @interface Pweson : NSObject
@property(nonatomic,copy)NSString * name;
@property(nonatomic)NSInteger age; -(id)initWithDictionary:(NSDictionary *)dic;
@end ———————————————————————————————————————————————(.m文件) #import "Pweson.h" @implementation Pweson
-(id)initWithDictionary:(NSDictionary *)dic{
self = [super init];
if (self) {
[self setValuesForKeysWithDictionary:dic];
}
return self;
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{ }
@end
person 文件
———————————————————————————————————————————————(.h文件) #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end ———————————————————————————————————————————————(.m文件) #import "ViewController.h"
#import "Pweson.h" @interface ViewController ()
@property(nonatomic,copy)Pweson * person;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightGrayColor];
NSDictionary * dic = @{@"name":@"张华",@"age":@};
_person = [[Pweson alloc] initWithDictionary:dic];
[self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
label.textAlignment = NSTextAlignmentCenter;
label.text = _person.name;
[self.view addSubview:label];
[label release]; UILabel * agelabel = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
agelabel.tag = ;
agelabel.backgroundColor = [UIColor redColor];
agelabel.textAlignment = NSTextAlignmentCenter;
agelabel.text = [NSString stringWithFormat:@"%ld",self.person.age];
[self.view addSubview:agelabel];
[agelabel release]; UIButton * but = [UIButton buttonWithType:UIButtonTypeSystem];
but.frame = CGRectMake(, , , );
but.tintColor = [UIColor blueColor];
[but setTitle:@"增加1岁" forState:UIControlStateNormal];
[but addTarget:self action:@selector(addAge:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:but];
[but release]; }
-(void)addAge:(UIButton *)sender{
self.person.age += ;
} -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqualToString:@"age"]) {
((UILabel *)[self.view viewWithTag:]).text = [NSString stringWithFormat:@"%ld",self.person.age];
}
}
ViewController 文件
UI:KVO、KVC的更多相关文章
- iOS监听模式之KVO、KVC的高阶应用
KVC, KVO作为一种魔法贯穿日常Cocoa开发,笔者原先是准备写一篇对其的全面总结,可网络上对其的表面介绍已经够多了,除去基本层面的使用,笔者跟大家谈下平常在网络上没有提及的KVC, KVO进阶知 ...
- UI:归档、反归档、数据持久化
支持的文件读写类型:字符串.数组.字典.NSdata (可变的.不可变的.共有8个类) 对于数组.字典在写入文件时,其中的元素也必须是以上四种类型之一. 支持的数据类型有限.且简单 写入文件: 字符 ...
- UI:多线程 、用GCD创建线程
什么是应用(程序):就是我们编写的代码编译后生成的app文件 进程:凡是一个运行的程序都可以看作为一个进程,如打开的多个 word,就可以认为是一个进程的多个线程. 线程:至少有一个线程就是主线程,网 ...
- UI:UINavigationController、界面通信
IOS中实现对控制器的管理的控制器有:UINavigationController 和 UITableBarController 两个控制器.下面是主要学习前者. 参考 ⼀.UINavigationC ...
- UI:UIScrollView、UIPageControl
一.UIScrollView的常⽤用属性 二.UIScrollView的常⽤用代理方法 三.UIPageControl的使⽤用 四.UIPageControl与UIScrollView的结合使⽤用 U ...
- KVC、KVO、NSNotification、delegate 总结及区别
1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b
1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...
- Hybrid框架UI重构之路:六、前端那点事儿(Javascript)
上文回顾 :Hybird框架UI重构之路:五.前端那点事儿(HTML.CSS) 这里讲述在开发的过程中,一些JS的关键点. 换肤 对于终端的换肤,我之前一篇文章有说了我的想法. 请查看:http:// ...
- Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)
上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...
随机推荐
- 用 jQuery实现图片等比例缩放大小
原文:http://www.open-open.com/code/view/1420975773093 <script type="text/javascript"> ...
- 一个球,初始高度100,每次落下回弹一半高度,求第n次落下球走的距离
def get_height(n): if n==1: eturn 150 return 100+sum([200*pow(0.5,i) for i in range(1,n)])+100*pow(0 ...
- 【Todo】Java的JIT机制
先是参考了这篇说的不怎么详细的文章<Java的JIT机制>(Link) JIT是just in time,即时编译技术.使用该技术,能够加速java程序的执行速度. 通常javac将程序源 ...
- BUPT复试专题—哈夫曼编码(2009)
题目描述 哈夫曼编码中 平均码长=码长×码字出现的概率 如:ABCDE 五个字符的出现次数分别为50 20 5 10 15 那么,其哈夫曼编码为A:0 B:10 C:1110 D:111 ...
- 深入研究Clang(五) Clang Lexer代码阅读笔记之Lexer
作者:史宁宁(snsn1984) Clang的Lexer(词法分析器)的源代码的主要位置例如以下: clang/lib/Lex 这里是基本的Lexer的代码: clang/include/cla ...
- android的armeabi和armeabi-v7a
在ANE中如果SDK调用了so库,则需要把so库放到ANE下Android-ARM/lib/armeabi (调试模式)或者 armeabi-v7a(发行模式)下. 可以贴个ADT代码说明问题: // ...
- DesiredSize,RenderSize&& Width ,ActualWidth
做UI的时候刚入门,很多属性摸不着头脑,需要的功能和属性不能很快联系联想到,所以要慢慢积累UIElement 的DesiredSize 和 RenderSize UIElement 的DesiredS ...
- python处理blog文件数据
以下是Python数据处理的题目说明与要求: The attachment is a log file used to show running status of set-top-box, and ...
- v-on指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux输入子系统(6)-input子系统介绍及结构图
注:本系列转自: http://www.ourunix.org/post/290.html input子系统介绍 输入设备(如按键,键盘,触摸屏,鼠标,蜂鸣器等)是典型的字符设备,其一 ...