步骤:
1. 注册,指定被观察者的属性,
2. 实现回调方法
3. 移除观察
效果图:当所有的输入框都有值的时候,Button才可以点击
//
用户输入的值在
textField
的代理方法中给
model
赋值,
#pragma mark ---- textFieldDelegate
- (
BOOL
)textField:(
UITextField
*)textField shouldChangeCharactersInRange:(
NSRange
)range replacementString:(
NSString
*)string {
NSString * contentString;
if (string. length == 0 ) {
if (textField. text . length > 0 ) {
contentString = [textField. text substringToIndex :textField. text . length - 1 ];
} else
{
contentString = nil ;
}
} else {
contentString = [ NSString stringWithFormat : @"%@%@" ,textField. text ,string];
}
if (textField. tag == 102 ) { // 手机号
if (contentString. length > 11 ) {
return NO ;
}
self . bankModel . bankPhoneNumber = contentString;
} else if (textField. tag == 101 ) { // 银行卡号
if (contentString. length > 25 ) {
return NO ;
}
self . bankModel . bankCardNumber = contentString;
}
return YES ;
NSString * contentString;
if (string. length == 0 ) {
if (textField. text . length > 0 ) {
contentString = [textField. text substringToIndex :textField. text . length - 1 ];
} else
{
contentString = nil ;
}
} else {
contentString = [ NSString stringWithFormat : @"%@%@" ,textField. text ,string];
}
if (textField. tag == 102 ) { // 手机号
if (contentString. length > 11 ) {
return NO ;
}
self . bankModel . bankPhoneNumber = contentString;
} else if (textField. tag == 101 ) { // 银行卡号
if (contentString. length > 25 ) {
return NO ;
}
self . bankModel . bankCardNumber = contentString;
}
return YES ;
}
// model的懒加载时,使用KVO给属性添加观察者;
定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边
- (
XZBankListModel
*)bankModel {
if (! _bankModel ) {
_bankModel = [[ XZBankListModel alloc ] init ];
[ _bankModel addObserver : self forKeyPath : @"content" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
[ _bankModel addObserver : self forKeyPath : @"bankAddress" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
[ _bankModel addObserver : self forKeyPath : @"bankCardNumber" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
[ _bankModel addObserver : self forKeyPath : @"bankPhoneNumber" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
}
return _bankModel ;
}
if (! _bankModel ) {
_bankModel = [[ XZBankListModel alloc ] init ];
[ _bankModel addObserver : self forKeyPath : @"content" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
[ _bankModel addObserver : self forKeyPath : @"bankAddress" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
[ _bankModel addObserver : self forKeyPath : @"bankCardNumber" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
[ _bankModel addObserver : self forKeyPath : @"bankPhoneNumber" options : NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : NULL ];
}
return _bankModel ;
}
//
实现回调方法:
当属性的值发生改变的时候,作出相应的视图的改变
-(
void
)observeValueForKeyPath:(
NSString
*)keyPath ofObject:(
id
)object change:(
NSDictionary
*)change context:(
void
*)context
{
if (( self . bankModel . bankCardNumber . length > 0 )&&( self . bankModel . bankAddress . length > 0 )&&( self . bankModel . bankPhoneNumber . length > 0 )&&( self . bankModel . content . length > 0 )) {
[ self . sureBtn setBackgroundColor : XZColor ( 14 , 93 , 210 )];
self . sureBtn . userInteractionEnabled = YES ;
} else {
[ self . sureBtn setBackgroundColor : XZColor ( 188 , 194 , 207 )];
self . sureBtn . userInteractionEnabled = NO ;
}
{
if (( self . bankModel . bankCardNumber . length > 0 )&&( self . bankModel . bankAddress . length > 0 )&&( self . bankModel . bankPhoneNumber . length > 0 )&&( self . bankModel . content . length > 0 )) {
[ self . sureBtn setBackgroundColor : XZColor ( 14 , 93 , 210 )];
self . sureBtn . userInteractionEnabled = YES ;
} else {
[ self . sureBtn setBackgroundColor : XZColor ( 188 , 194 , 207 )];
self . sureBtn . userInteractionEnabled = NO ;
}
}
//
增加观察与取消观察是成对出现的:
移除观察者
- (
void
)dealloc
{
[ self . bankModel removeObserver : self forKeyPath : @"content" ];
[ self . bankModel removeObserver : self forKeyPath : @"bankAddress" ];
[ self . bankModel removeObserver : self forKeyPath : @"bankCardNumber" ];
[ self . bankModel removeObserver : self forKeyPath : @"bankPhoneNumber" ];
{
[ self . bankModel removeObserver : self forKeyPath : @"content" ];
[ self . bankModel removeObserver : self forKeyPath : @"bankAddress" ];
[ self . bankModel removeObserver : self forKeyPath : @"bankCardNumber" ];
[ self . bankModel removeObserver : self forKeyPath : @"bankPhoneNumber" ];
}
小结
KVO这种编码方式使用起来很简单,很适用于model修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。