iOS开发NSNotification(通知)的正向传值

提出问题

前几天一个群友遇到了一个关于NSNotification的问题:现有A,B两个界面,B界面由A界面push展示出来,A有一输入框和按钮,B有一lable,想实现的效果是点击A的按钮,将A输入框的文字传到B的lable上,问题是第一次无法实现这个,第二次正常。。。

问题分析

这个为题的根源在于通知的执行步骤,要想完成一个通知,主要有分三步走:

(1)注册通知: [[NSNotificationCenter defaultCenter]addObserver:  selector:  name:  object: ]; ps:说一下几个参数意思:Observer:(谁来接受通知消息);selector(方法选择,执行哪个方法); name:(通知的名称,也可以说是通知消息的标识,按照这个来区分是否接受通知);object:(接受谁的通知,用这个参设置,nil为接受所有文件发送的通知)。

(2)发送通知: [[NSNotificationCenter defaultCenter]postNotificationName: object: userInfo:];  Name:(通知标识,与注册通知是的标识对应);object:(发送方);userInfo:(重点说一下,这是一个字典类型的对象,可以把需要传递的值放进这个字典里)。

(3)执行通知方法:实现注册通知是选择的方法,selector后边的。这里不在多说。

这三部是按顺序来的,上边的那个问题就是顺序的问题,B是Apsuh得到的,比A晚出现,在A中发送通知,B中注册通知并执行通知方法,显然是先执行post,然后执行add,

也就是说post(发送通知)的时候,还没有add(注册通知),系统找不到接受通知消息的对象,所以导致传值的失败,第二次成功是因为已经注册通知并没有移除,所以第二次可以。这种从前往后的正向传值一般不用通知还是用block和属性传值比较好。

问题解决

虽然这种正向传值我们提倡用block和属性传值,但是如果用通知的机制能不能实现呢?答案是肯定的,我们只要保证add(注册通知)在post(发送通知)之前就可以了。

1.这种方法就是在B重写init方法,并把 [[NSNotificationCenter defaultCenter]addObserver:  selector:  name:  object: ];方法写进init中,

2.把发送方法[[NSNotificationCenter defaultCenter]postNotificationName: object: userInfo:]; 写在点击按钮push出B的语句后边,这样就可以了。

这里主要涉及视图控制器的生命周期,也就是各个方法的执行顺序:

一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc                                   创建对象,分配空间
2、init                                      初始化对象,初始化数据
3、loadView                            加载视图
4、viewDidLoad                      载入完成
5、viewWillAppear                 视图将出现在屏幕
6、viewDidAppear                 视图已在屏幕上渲染完成

当一个视图被移除屏幕并且销毁的时候的执行顺序,
1、viewWillDisappear            视图将被从屏幕上移除之
2、viewDidDisappear            视图已经被从屏幕上移除
3、dealloc                              视图被销毁


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值