NSNotificationCenter 相比与 Delegate 可以实现更大的跨度的通信机制,可以为多个无引用关系的对象进行通信。
利用通知逆向传值:通知的使用首先注册获取通知中心单例
(1) //1.获取通知中心
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//2.发布通知
/**
第一个参数:通知中心的名字
第二个参数:通知的发布者
第三个参数:附带信息
*/
[center postNotificationName:@"changeColor" object:self userInfo:@{@"color":color}];
//发布第二个通知
[center postNotificationName:@"changeFont" object:self userInfo:@{@"font":[UIFont systemFontOfSize:40]}];
//注意:最好在跳转之前进行通知的发布
[self.navigationController popViewControllerAnimated:YES];
(2)接收通知的传值
//注意:一般将观察者的注册放在viewWillAppear:里面,因为这个方法在每次进入当前界面的时候都会执行.
//不放在ViewDidLoad里面
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//注册观察者
//1.通知单例获取通知中心
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//2.注册观察者
/**
第一个参数:要注册的观察者
第二个参数:接到通知后要执行的功能
第三个:通知的名字
第四个:通知的发布者,通常为nil
*/
[center addObserver:self selector:@selector(changeBackgroundColor:) name:@"changeColor" object:nil];
//注册changeFont通知的观察者
[center addObserver:self selector:@selector(changeFont:) name:@"changeFont" object:nil];
}
//changeFont通知对应的方法
-(void)changeFont:(NSNotification *)notification{
ZKButton *button = (ZKButton *)[self.view viewWithTag:10];
NSDictionary *dic = notification.userInfo;
button.titleLabel.font = dic[@"font"];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
//通知的方法
//注意:当前的参数不是通知中心,是通知
-(void)changeBackgroundColor:(NSNotification *)notification{
//从通知中取出附带信息
//在附带信息中拿到要设置的颜色值
NSDictionary *dic = notification.userInfo;
//NSLog(@"notification.name%@,notification.object%@,dic[color]:%@",notification.name,notification.object,dic[@"color"]);
//利用获取到的颜色值改变主界面的背景色
self.view.backgroundColor = dic[@"color"];
//释放观察者
//作用:将当前的观察者彻底释放(结果:当前观察者下的所有其他的通知都无法接受)
//[[NSNotificationCenter defaultCenter] removeObserver:self];
/**
* 第二个参数:当前的通知名字
作用:只释放当前通知自己对应的观察者(结果:当前观察者下的其他通知可以照常接受)
*/
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"changeColor" object:nil];
}