(1)通知是什么?
之前写过一篇文章,也是关于通知的,但是偏理论化.
NSNotification的使用:http://blog.csdn.net/v5v6_neil/article/details/39120671
今天来一篇偏重实际应用的通知实例.相信这样两篇文章后,能够给让我们对于通知有较为深刻的理解了.
(2)通知能够解决什么问题?
通俗的讲,通知是一种广播模式,当有多个页面对某一个页面的某个控件(或者特性)关注时候,我们可以采用通知模式.这样,当我们关注页面的特性发生变化后,其他页面就检测到这个变化,然后哥哥页面会采取相应的响应措施.
(3)通知实现实例?
我做了一个小的demo,demo中含有三个页面,我想要实现的是当第二个页面的UITextField开始编辑的时候,我的第一页和第三页设置更改背景色.
首先第二页发送通知,这个发送通知的时间点很重要,我们需要检测的时UITextField是否开始编辑,那么就需要写在代理方法里面
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"开始编辑了");
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeColor" object:self];
}
然后我们在第一页注册监听者,以及监听后的实现方法.
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//初始化通知中心
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(changeColor) name:@"changeColor" object:nil];
}
当监听到通知后,会有相应响应
- (void)changeColor
{
self.view.backgroundColor = [UIColor redColor];
}
同样,我们在第三页注册监听者以及设定监听方法(这里不再赘述).
到此为止,我们的通知设定完毕,当我们开始编辑UITextField框的时候,就会触发发送消息的方法,广播消息,当第一页和第三页收到消息,就会采取相应行动(changeColor).
(4)通知的传值应用
通知不仅可以用来广播消息,同时在广播的时候可以传值,给所有他得粉丝(监听者)传值具体方法如下
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"开始编辑了");
//[[NSNotificationCenter defaultCenter] postNotificationName:@"changeColor" object:self];
[[NSNotificationCenter defaultCenter]postNotificationName:@"changeColor" object:self userInfo:[NSDictionary dictionaryWithObject:@"red" forKey:@"color"]];
}
这里就是将一个字典信息发送出去.自然粉丝的接收也需要从字典里面取值
- (void)changeColor:(NSNotification*)notification
{
NSDictionary *dic = [notification userInfo];
NSString *str = [dic valueForKey:@"color"];
if ([str isEqualToString:@"red"]) {
self.view.backgroundColor = [UIColor redColor];
}
}
(5)最后有一点需要强调的是,无论有多少个监听者,每个注册为监听者的对象最后都得释放,不然就会像我之前文章中描述的那样,可能出现野指针的崩溃.
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"back" object:nil];
}
OK,finished! Good,luck!