KVO - NSKeyValueObserving
KVO:
三个步骤:
1. 注册监听
2. 使用回调,对监听对象处理
3. 移除监听
// 使用UITextField 的 text 属性,示例。self.testField = [[UITextFieldalloc] initWithFrame:CGRectMake(0,100,CGRectGetWidth(self.view.bounds),40)];self.testField.backgroundColor = [UIColoryellowColor]; [self.view addSubview:self.testField];// 需要监听的对象 add 观察者 forkey 观察属性 描述内容[self.testField addObserver:selfforKeyPath:@"text"options:(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew) context:@"输入框的 输入控制"];
4种Option:
NSKeyValueObservingOptionNew=0x01, 新值
NSKeyValueObservingOptionOld=0x02, 旧值
NSKeyValueObservingOptionInitial=0x04, 初始化的值?
NSKeyValueObservingOptionPrior=0x082次回调,变化前后。
// 当监听对象key 的属性值,变化时,就会有这个回调。
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{if([keyPath isEqualToString:@"text"]) {NSString*oldStr = change[NSKeyValueChangeOldKey];NSString*newStr = change[NSKeyValueChangeNewKey];if(newStr.length ==0) {NSLog(@"输入长度不能为0"); }elseif(newStr.length >8) {NSLog(@"输入长度不能大于8"); }else{NSLog(@"cool : %@ 变为 %@",oldStr,newStr); } }}
此处获取变化值时,使用的是对于的 key
FOUNDATION_EXPORTNSString*constNSKeyValueChangeNewKey;FOUNDATION_EXPORTNSString*constNSKeyValueChangeOldKey;FOUNDATION_EXPORTNSString*constNSKeyValueChangeNotificationIsPriorKey; 是否优先回调key。使用NSKeyValueObservingOptionPrior时 ,2次回调,第一次返回值1.FOUNDATION_EXPORTNSString*constNSKeyValueChangeKindKey;FOUNDATION_EXPORTNSString*constNSKeyValueChangeIndexesKey;
// 注意不要重复移除。注册-移除 一对一。
[self.testField removeObserver:selfforKeyPath:@"text"];