手机
当前位置:查字典教程网 >编程开发 >Java >以实例讲解Objective-C中的KVO与KVC机制
以实例讲解Objective-C中的KVO与KVC机制
摘要:KVO实例浅析最近遇到个问题,在处理项目中一个评论界面时,因为直接用的是UIWebView展示评论列表,结果取到的页面上下都有一段CGSiz...

KVO实例浅析

最近遇到个问题,在处理项目中一个评论界面时,因为直接用的是UIWebView展示评论列表,结果取到的页面上下都有一段CGSize为(320,65)的乱七八糟的广告,十分碍眼.头部广告因很方便的在头部坐标贴上自己的logo解决了,但是尾部的,因为每个页面的评论长短不一,坐标也就不一样,这样就不能给定死坐标去贴logo,思前想后,通过KVO很好的解决了这个问题.

@KVO概述:

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。

简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

使用步骤如下:

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 触发回调方法

4. 移除观察

代码实例:复制代码 代码如下:

-(void)viewDidLoad{

// KVO,作为一个观察者,只要属性"contentSize"发生变化,回调方法里面就会通知

[_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL];

}

// 回调方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context

{

if(object == _webView.scrollView && [keyPath isEqualToString:@"contentSize"])

{

// 得到最大的Y坐标

CGSize size = _webView.scrollView.contentSize;

if (size.height > 568.0) {

// 遮挡广告

_hideBottomImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, size.height-67, ScreenWidth, 67)];

_hideBottomImage.image = [UIImage imageNamed:@"banner"];

[_webView.scrollView addSubview:_hideBottomImage];

[_hideBottomImage release];

}

}

else

{

// 调用父类的方法

[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

}

}

- (void)dealloc{//---->在ARC环境下也能调用dealloc方法,只是不需要写[super dealloc]

// 移除KVO,否则会引起资源泄露

[_webView.scrollView removeObserver:self forKeyPath:@"contentSize"];

[super dealloc];

}

上面是针对contentSize属性,其他属性依此类推

KVC

通常,我们都是通过属性的set和get方法来赋值和取值,这里介绍用Key-Value-Coding(KVC)键值编码来给类的属性赋值和取值.

1.基本方式(setValue:forKey: valueForKey)

复制代码 代码如下:

// ---定义一个Student类(.m文件无任何操作)

#import <Foundation/Foundation.h>

@class HMTClass;

@interface HMTStudent : NSObject{

NSString * _name;

BOOL _test;

BOOL _isTest;

BOOL test;

BOOL isTest;

}

@property (nonatomic,copy)NSString * name;

@property (nonatomic,copy)NSString * sex;

@property (nonatomic,assign)NSInteger age;

@property (nonatomic,strong) HMTClass * hmtClass;

@end

// ---main文件

HMTStudent * student = [[HMTStudent alloc] init];

student.hmtClass = [[HMTClass alloc] init];

student.name = @"humingtao”; // set方法赋值

// KVC赋值

[student setValue:@“mawei is dog" forKey:@"name”];

[student setValue:@"m" forKey:@"sex"];

[student setValue:@(10) forKey:@"age"];

// 取值

NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,[student valueForKey:@"name"]);

特别注意:

我在类里面还定义了4个BOOL值变量,用来验证KVC访问属性键顺序

[student setValue:@(YES) forKey:@"test”];

结果是:_test—>_isTest—>test—>isTest

2.键路径访问(用于一个类中属性的属性 setValue:ForKeyPath: forKeyPath)

复制代码 代码如下:

// 创建一个班级类

@interface HMTClass : NSObject

@property (nonatomic,copy)NSString * name;

@end

然后前面第一点中在Student类中写了一个班级属性hmtClass

复制代码 代码如下:

HMTClass *hmtClass = [[HMTClass alloc]init];

[hmtClass setValue:@"宇宙一班" forKey:@"name"];

[student setValue:hmtClass forKey:@"hmtClass"];

NSString *hmtClassName = [student valueForKeyPath:@"hmtClass.name"];

//也可以这样存值

[student setValue:@"宇宙一班" forKeyPath:@"hmtClass.name"];

student.hmtClass.name = [student valueForKeyPath:@"hmtClass.name"];

3.自动封装基本数据类型

我们在Student类中添加分数属性 NSInteger number 学号;

复制代码 代码如下:

#import <Foundation/Foundation.h>

@class HMTClass;

@interface HMTStudent : NSObject

{

NSString *_name;

NSInteger number;

}

@end

[student setValue:@"100" forKeyPath:@"number"];

NSString *number = [student valueForKey:@"number"];

可见用NSString*类型设置的属性值@"100",而我们的属性是NSInteger类型的,存取都没有问题。

4.操作集合

在Student类中加入数组NSArray,用来表示其他的学生。

复制代码 代码如下:

#import <Foundation/Foundation.h>

@class HMTClass;

@interface HMTStudent : NSObject

{

NSArray *manyStudents;

}

@end

Student *student1 = [[HMTStudent alloc]init];

Student *student2 = [[HMTStudent alloc]init];

Student *student3 = [[HMTStudent alloc]init];

[student1 setValue:@"200" forKey:@"number"];

[student2 setValue:@"300" forKey:@"number"];

[student3 setValue:@"400" forKey:@"number"];

NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];

[student setValue:array forKey:@"manyStudents"];

NSLog(@"%@",[student valueForKeyPath:@"manyStudents.number"]);

打印出来是数组(200,300,400)

【以实例讲解Objective-C中的KVO与KVC机制】相关文章:

深入解析java中的静态代理与动态代理

java使用poi读取excel内容方法实例

eclipse启动tomcat无法访问的解决方法

java文件操作代码片断实例实现统计文件中字母出现的个数功能

详解Java中super的几种用法并与this的区别

二进制中1的个数

实例分析Java Class的文件结构

关于struts返回对象json格式数据的方法

java解析xml之sax解析xml示例分享

java中Filter过滤器处理中文乱码的方法

精品推荐
分类导航