KVC(key-value coding)
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_objectb = [[ObjectB alloc]init];
_objectb.str = @"sss";
[_objectb addObserver:self forKeyPath:@"str" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
_objectb.str = @"sss2";
}
// 第二步,实现接收通知的接口方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey,id> *)change
context:(void *)context {
// 这里最好判断一下object的类型和keyPath的值,不符合则交给父类处理
if ([object isKindOfClass:[ObjectB class]] && [keyPath isEqualToString:@"str"]) {
NSLog(@"%@", change); // 这里可以读取到 new = 999
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
// 第三步,移除观察者。
- (void) dealloc {
[_objectb removeObserver:self forKeyPath:@"str"];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
_objectb.str = @"999";
}
KVO可以在MVC模式中得到很好的应用。因为当Model发生变化时,通过KVO可以很方便地通知到Controller,从而通过Controller来改变View的展示。所以说 KVO是解决Model和View同步的好办法。
NSNotificationCenter
1、创建通知,最好在viewDidLoad的方法中创建
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:) name:@"tongzhi" object:nil];
}
- (void) tongzhi:(NSNotification *)notification{
NSLog(@"通知过来的 - dic = %@",notification.object);
}
2、发送通知
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"324234",@"bankId",@"某某银行",@"bankName", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"tongzhi" object:dic];
3、移除通知,由那个控制器创建由那个控制器移除,谁创建谁移除,最好在dealloc方法中移除,
-(void)dealloc{
//第一种方法.这里可以移除该控制器下的所有通知
// 移除当前所有通知
NSLog(@"移除了所有的通知");
[[NSNotificationCenter defaultCenter] removeObserver:self];
//第二种方法.这里可以移除该控制器下名称为tongzhi的通知
//移除名称为tongzhi的那个通知
NSLog(@"移除了名称为tongzhi的通知");
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}
系统自带的通知有:
UIDevice通知...
UIDeviceOrientationDidChangeNotification // 设备旋转
UIDeviceBatteryStateDidChangeNotification // 电池状态改变
UIDeviceBatteryLevelDidChangeNotification // 电池电量改变
UIDeviceProximityStateDidChangeNotification // 近距离传感器(比如设备贴近了使用者的脸部)
键盘通知...
//应用程序进入到后台的通知
//UIApplicationDidEnterBackgroundNotification 程序进图后台的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationGotoBackGround) name:UIApplicationDidEnterBackgroundNotification object:nil];
//接受到键盘frame改变的通知
//UIKeyboardWillChangeFrameNotification 键盘frame将要改变的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
网友评论