参考网上教程
KVO:Key-Value Observing,键与值观察。观察中值改变通过键调用方法,如应用中,视图中数据改变刷新界面的视图。
关键字:1.对象 2.设置对象的KVO 3.实现回调方法, 4.移除观察
简单代码:
1. 新建工程,Single View Application
2.添加 数值类, NSString* kvoStr, kvoStr就是KVO中的 Value,Key在实现时自己添加
#import <Foundation/Foundation.h>
@interface KVOData : NSObject
@property (retain,nonatomic) NSString* kvoStr;
@end
#import "KVOData.h"
@implementation KVOData
@end
3.引用数值类,创建对象,以及对象的KVO,
#import <UIKit/UIKit.h>
#import "KVOData.h"
@interface ViewController : UIViewController
{
KVOData *kvoData;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
kvoData = [[KVOData alloc]init];
[kvoData setValue:@"kvo value init." forKey:@"kvoStr"];
NSLog(@"kvo Str:%@", [kvoData valueForKey:@"kvoStr"] );
[kvoData addObserver:self
forKeyPath:@"kvoStr"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:NULL];
}
4.实现回调
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *changeBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
changeBtn.frame = CGRectMake(120, 200, 120, 40);
changeBtn.titleLabel.text = @"change";
[changeBtn addTarget:self
action:@selector(changeBtnPressed)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:changeBtn];
}
- (void)changeBtnPressed
{
[kvoData setValue:@"kvo value changed." forKey:@"kvoStr"];
NSLog(@"changeBtnPressed.");
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"kvoStr"]) {
NSLog(@"%@",[kvoData valueForKey:@"kvoStr"]);
}
}
5.移除观察
- (void)dealloc
{
[super dealloc];
[kvoData removeObserver:self forKeyPath:@"kvoStr"];
[kvoData release];
}