在iOS的设计模式中,经常会用到在不同的视图中传值,上一篇已经小结了“代理设计模式”,今天拾图网和温州天时网络建设一个来小结一下——通知传值模式。通知模式也是其中重要的模式之一,Notification直译为通知,其实本人觉得叫做广播模式更为贴切。
通知模式的作用就是一个对象对多个对象的同步操作。
用法很简单,一个对象发出一个广播,需要收听的听众就先注册一下,然后选定频道,完了就可以收听广播的内容了;但是要注意一点, 在收听之前, 一定要先注册; 不然发送的广播接受不到, 也就是值改变了, 不会做出响应。
要实现通知功能第一步要在viewDidLoad或者其他地方添加通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTable:) name:@"updateTable" object:nil];
NSNotificationCenter:为一个单例模式的类,能调用的方法也比较有限,可以自行查阅api;
addobserver:后面的参数为你当前的类,或者你要接收消息的类;
selector:收到通知后需要执行的方法。
name为通知的名字,object可以作为消息传递的参数。
下面是一个简单的demo, 效果如下:
1、听众视图界面,用来做为听众功能, 注册收听广播;
2、广播视图界面,用来做为广播功能, 发送广播;
3、当第二个界面(即:广播视图界面)发出一个广播后, 第一个界面自动接收。
具体实现代码如下:
第一个界面, 注册成为听众, 并设置收到广播后的响应事件:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 我们喜欢听ChangeTheme的广播 // 注册成为广播站ChangeTheme频道的听众 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; // 成为听众一旦有广播就来调用self recvBcast:函数 [nc addObserver:self selector:@selector(recvBcast:) name:@"ChangeTheme" object:nil]; } // 这个函数是系统自动来调用 // ios系统接收到ChangeTheme广播就会来自动调用 // notify就是广播的所有内容 - (void) recvBcast:(NSNotification *)notify { static int index; NSLog(@"recv bcast %d", index++); // 取得广播内容 NSDictionary *dict = [notify userInfo]; NSString *name = [dict objectForKey:@"ThemeName"]; UIColor *c = [dict objectForKey:@"ThemeColor"]; self.title = name; self.view.backgroundColor = c; }
第二个界面, 发送广播
- (IBAction)btnClick:(id)sender { // 取得ios系统唯一的全局的广播站 通知中心 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //设置广播内容 NSString *name = @"设置颜色"; UIColor *color_ = [UIColor redColor]; NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: name, @"ThemeName", color_, @"ThemeColor", nil]; //将内容封装到广播中 给ios系统发送广播 // ChangeTheme频道 [nc postNotificationName:@"ChangeTheme" object:self userInfo:dict]; }