iOS语法之KVO的使用

KVO:Key Value Observing,顾名思义,键值观察。
KVO主要用于视图交互方面,比如界面的某些数据变化了,界面的现实也跟着需要变化,那就要简历数据和页面的关联。
下面通过实例讲解KVO的简单使用。

KVO自动调用简单使用

1234567891011121314151617181920
////  Student.h//  testOC////  Created by Benjamin on 1/4/16.//  Copyright  2016 Benjamin. All rights reserved.//

#import <Foundation/Foundation.h>

@interface Student : NSObject {

NSString *_name;    NSString *_courseName;    int _age;}

- (void)changeCourseName:(NSString *) newCourseName;- (void)changeAge:(int) age;@end
12345678910111213141516171819202122
////  Student.m//  testOC////  Created by Benjamin on 1/4/16.//  Copyright  2016 Benjamin. All rights reserved.//

#import "Student.h"

@implementation Student

-(void)changeCourseName:(NSString *)newCourseName {    _courseName = newCourseName;}

- (void)changeAge:(int)age {    _age = age;}

@end
123456789101112131415161718192021222324252627282930313233343536
////  PageView.m//  testOC////  Created by Benjamin on 1/4/16.//  Copyright  2016 Benjamin. All rights reserved.//

#import "PageView.h"#import "Student.h"

@implementation PageView

-(id)init:(Student *)initStudent {    if (self == [super init]) {        student = initStudent;        // options确定返回的字典包含什么值:NSKeyValueObservingOptionNew包含新值        // NSKeyValueObservingOptionNew包含旧值        // keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)        [student addObserver:self forKeyPath:@"courseName" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];    }    return self;}

-(void)dealloc {    [student removeObserver:self forKeyPath:@"courseName" context:nil];}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {    if ([keyPath isEqual:@"courseName"]) {        NSLog(@"PageView课程被改变了");        NSLog(@"PageView新课程是: %@, 老课程是: %@", [change objectForKey: @"new"], [change objectForKey: @"old"]);    }}

@end

测试代码

123456789101112131415161718192021
- (void)useKVO {    Student *student = [[Student alloc] init];    [student changeCourseName:@"语文课"];    [student changeAge:19];    NSLog(@"初始值: %@ %@", [student valueForKey: @"courseName"], [student valueForKey: @"age"]);

PageView *page = [[PageView alloc]init:student];    [student setValue:@"数学课" forKey:@"courseName"];    [student changeCourseName:@"英语课"];  //这样直接改变不会触发observer,说明只有通过键值编码(KVC)改变的值,才会回调观察者注册的方法。

[student willChangeValueForKey:@"age"];    [student changeAge:20];    [student didChangeValueForKey:@"age"];

/**     输出结果:     2016-01-04 14:47:36.794 testOC[31517:1071934] 初始值: 语文课     2016-01-04 14:47:36.795 testOC[31517:1071934] PageView课程被改变了     2016-01-04 14:47:36.795 testOC[31517:1071934] PageView新课程是: 英语课, 老课程是: 语文课     **/}

输出结果:

123
2016-01-05 17:59:15.642 testOC[42635:1792662] 初始值: 语文课 192016-01-05 17:59:15.643 testOC[42635:1792662] PageView课程被改变了2016-01-05 17:59:15.643 testOC[42635:1792662] PageView新课程是: 数学课, 老课程是: 语文课

可以看到,只有通过KVC方式赋值才会触发Observer。
不懂KVC的童鞋,请看这篇文章: KVC
不懂观察者模式的童鞋可以看看这篇文章:Observer

参考:http://www.cnblogs.com/stoic/archive/2012/07/24/2606784.html

时间: 2024-08-02 18:59:28

iOS语法之KVO的使用的相关文章

iOS编程——Objective-C KVO/KVC机制[转]

这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码  1.     1 .Person类  2.     @implementation Person  3.     @synthesize name,age;//属性name 将被监视  4.     -(void) changeName  5.     {  6.         name=@"changeNam

ios layer-iOS AVPlayer KVO问题

问题描述 iOS AVPlayer KVO问题 [_playerItem addObserver:self forKeyPath:@""status"" options:NSKeyValueObservingOptionNew context:&ItemStatusContext]; 之后-- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDict

iOS语法之KVC的使用

KVC简介 全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制. KVC的应用 以下通过几个例子来说明KVC中得常用方法: 新建一个Student(学生)类 1234567891011 #import <Foundation/Foundation.h> @class Course;@interface Student : NSObject { NSString *name; Cou

正则表达式在IOS中的应用及IOS中三种正则表达式的使用与比较_正则表达式

正则表达式在ios中应用 一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式达到字符串的复杂控制. 二.正则表达式的语法 看一个过滤纯数字的例子 - (BOOL)validateNumber:(NSString *) textString { NSString* number=@"^[0-9]+$"; NSPredicate *numbe

iOS - Regex 正则表达式

1.Regex 定义 正则表达式又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为 regex.regexp 或 RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本; 使用步骤 1.定义正则表达式规则 2.通过规则,创建正则表达式对象 3.利用正则表达式对象匹配字符串 注意:正则表达式通常缩写成 "regex" 2.语法介绍 正则

Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析_C 语言

本文以实例详细描述了Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect的定义及用法,具体如下所示: 1.NSRange: NSRange的原型为 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSMakeRange的函数: NS_INLINEz是内联函数 typedef NSRange *NSRangePointer; NS_IN

IOS中KVC与KVO的应用解析

IOS中KVC与KVO的应用解析 一.NSKeyValueCoding(KVC) 1.从一个小例子引入 KVC键值编码是Object-C为我们提供的一种对成员变量赋值的方法.在探讨其方法之前,我们先来看一个小例子: 首先,创建一个数据模型model类: ? 1 2 3 4 5 6 7 8 //.h文件 #import <Foundation/Foundation.h> @interface Model : NSObject {     @public//将成员变量设置为公有的 以便其他文件有访

iOS开发:delegate、notification、KVO的选择

  delegate.notification和KVO的功能比较类似,那么在实际的编程中,如何选择这些方式呢? 在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation; 2.通知中心Notification Center; 3.键值观察key value observing,KVO 因此,那为什么我们需要这些模式以及什么时候用它以及什么时候不用它. 下面完全根据

ios有一个叫KVO的数据库监控功能 请问asp.net web在页面上有类似的功能么

问题描述 ios有一个叫KVO的数据库监控功能请问asp.netweb在页面上有类似的功能么 解决方案 解决方案二:数据库触发器解决方案三:C#有INotify,但好像没有现成的通过Attribute的方式解决方案四:引用2楼starfd的回复: C#有INotify,但好像没有现成的通过Attribute的方式 可以说说具体怎么操作吗