iOS KVOの基本使用
3927 ワード
@interface Person : NSObject
@property(nonatomic,strong)NSString *name;//
//
- (void)changeName:(NSString*)name;
//
- (void)changeNameFromSetter:(NSString*)name;
@end
Person.mファイル
#import "Person.h"
@implementation Person
//
- (void)changeName:(NSString*)name{
_name = name;
}
//
- (void)changeNameFromSetter:(NSString*)name {
self.name = name;
}
@end
rootViewController.mファイル
#pragma mark - person
- (void)initPerson{
self.person = [[Person alloc] init];
self.person.name = @" ";
}
#pragma mark -
- (void)changeColor {
// self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
self.view.backgroundColor = [UIColor redColor];
}
1.登録観察者
//observer ( self.view )
//KeyPath:
//options: , ( )
//context: kvo
// self.view
// ( )
/*
options: 4 , :
NSKeyValueObservingOptionOld
NSKeyValueObservingOptionNew
NSKeyValueObservingOptionInitial , , 。 , 。
NSKeyValueObservingOptionPrior 2 。 。
*/
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:nil];
2.コールバックの実現方法
#pragma mark - kvo ( )
//keyPath:
//object:
//change: change
//context: ,context
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
id oldName = [change objectForKey:NSKeyValueChangeOldKey];
NSLog(@"oldName----------%@",oldName);
id newName = [change objectForKey:NSKeyValueChangeNewKey];
NSLog(@"newName-----------%@",newName);
// , kvo
// [object removeObserver:self forKeyPath:@"name"];
}
3.コールバックメソッドをトリガーする(ここでは、Person.mファイルでsetterメソッドまたはkvcを経由しない場合、例えば(_name=name)この場合kvcのコールバックメソッドはトリガーされません.つまり、コールバックメソッドをトリガーするには、setterメソッドまたはKVCを経由して値を割り当てる必要があります)
//
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:self action:@selector(oldAction)];
//
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:self action:@selector(newAction)];
#pragma mark - ( setter kvc, (_name = @" "), kvc )
// ( )
- (void)oldAction {
[self.person changeName:@" "];
}
//
- (void)newAction {
[self.person changeNameFromSetter:@" "];
}
4.観察者を除去するには、2つの方法があります.1つ目は、インタフェースが消えるときにKVOを除去することです.
// , kvo
[object removeObserver:self forKeyPath:@"name"];
- (void)dealloc {
[self.person removeObserver:self forKeyPath:@"name"];
self.person = nil;
}