浅谈通知NSNoticfication----通知实例操作

来源:互联网 发布:node.js python 编辑:程序博客网 时间:2024/05/18 03:45

(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!



0 0
原创粉丝点击