iOS-通知正向传值问题
2016-06-21 18:34
411 查看
前段时间在开发中遇到一个问题,需要将一个控制器的值传到另一个毫无关联的控制器上,不能用Block,不能用代理,然后考虑使用通知(NSNotification),但也遇到了很多问题,在这里与大家分享一些,问题最终还是解决了
比如大写字母为控制器:N代表导航控制器,T代表标签控制器,其他是普通控制器
N->T->A->B->C->D
N->T->E->F
当需要将D的值传给E,这种跨域跳转,我们不能用show,因为show过去后,A、B、C三个控制器没有被释放,模态跳转也一样,所以只能通过切换标签控制器的子控制类切换
跳转方法:
现在,控制器可以跳转,但如何传值呢?
还有很多种方法,一是:通知 二是:NSUserDefaults 属性传值
我首先考虑的是通知传值
要想完成一个通知,主要有分三个执行步骤,而且是按顺序来的
顺序很重要,顺序很重要,顺序很重要,重要的事情说三遍
1)注册通知:
ps:说一下几个参数意思:Observer:(谁来接受通知消息);selector(方法选择,执行哪个方法); name:(通知的名称,也可以说是通知消息的标识,按照这个来区分是否接受通知);object:(接受谁的通知,用这个参设置,nil为接受所有文件 发送的通知)。
2)发送通知:
Name:(通知标识,与注册通知是的标识对应);object:(发送方);userInfo:(重点说一下,这是一个字典类型的对象,可以把需要传递 的值放进这个字典里)。
(2-1) 执行通知方法:实现注册通知是选择的方法,selector后边的。这里不在多说。
3)移除通知:
问题就出现了:
当从控制器D跳到E时,第一次无法传值,第二次才成功,
原因是顺序的问题,控制器E 是从 控制器 D 跳转过来的,比D晚出现,在E中发送通知,D中注册通知并执行通知方法,显然是先执行post,然后执行add,所以第一次无法传值,第二次,通知已经被被注册了,所以可以传值
问题解决
只要保证add(注册通知)在post(发送通知)之前就可以了。
1.这种方法就是在B重写init方法,并把 [[NSNotificationCenter defaultCenter]addObserver: selector: name: object: ];方法写进init中,
2.把发送方法[[NSNotificationCenter defaultCenter]postNotificationName: object: userInfo:]; 写在点击按钮跳转出控制器的语句后边,这样就可以了。
总结:另外,通知是同步的,最好保持通知在同一个线程内,以免出现延迟或阻塞
比如大写字母为控制器:N代表导航控制器,T代表标签控制器,其他是普通控制器
N->T->A->B->C->D
N->T->E->F
当需要将D的值传给E,这种跨域跳转,我们不能用show,因为show过去后,A、B、C三个控制器没有被释放,模态跳转也一样,所以只能通过切换标签控制器的子控制类切换
跳转方法:
XMTabBarController *tabbarVC = (XMTabBarController *)[[UIApplication sharedApplication] keyWindow].rootViewController; tabbarVC.selectedIndex = 1; [self.navigationController popToRootViewControllerAnimated:YES];
现在,控制器可以跳转,但如何传值呢?
还有很多种方法,一是:通知 二是:NSUserDefaults 属性传值
我首先考虑的是通知传值
要想完成一个通知,主要有分三个执行步骤,而且是按顺序来的
顺序很重要,顺序很重要,顺序很重要,重要的事情说三遍
1)注册通知:
//注册通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notice:) name:@"sendMessage" object:nil];
ps:说一下几个参数意思:Observer:(谁来接受通知消息);selector(方法选择,执行哪个方法); name:(通知的名称,也可以说是通知消息的标识,按照这个来区分是否接受通知);object:(接受谁的通知,用这个参设置,nil为接受所有文件 发送的通知)。
2)发送通知:
//通过通知中心发送通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"sendMessage" object:info userInfo:nil];
Name:(通知标识,与注册通知是的标识对应);object:(发送方);userInfo:(重点说一下,这是一个字典类型的对象,可以把需要传递 的值放进这个字典里)。
(2-1) 执行通知方法:实现注册通知是选择的方法,selector后边的。这里不在多说。
3)移除通知:
// 移除通知 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"sendMessage" object:nil];
问题就出现了:
当从控制器D跳到E时,第一次无法传值,第二次才成功,
原因是顺序的问题,控制器E 是从 控制器 D 跳转过来的,比D晚出现,在E中发送通知,D中注册通知并执行通知方法,显然是先执行post,然后执行add,所以第一次无法传值,第二次,通知已经被被注册了,所以可以传值
问题解决
只要保证add(注册通知)在post(发送通知)之前就可以了。
1.这种方法就是在B重写init方法,并把 [[NSNotificationCenter defaultCenter]addObserver: selector: name: object: ];方法写进init中,
2.把发送方法[[NSNotificationCenter defaultCenter]postNotificationName: object: userInfo:]; 写在点击按钮跳转出控制器的语句后边,这样就可以了。
#pragma mark ---------- 利用通知正向传值,需要在init方法中注册通知 ----------
-(instancetype)init {
self =[super init];
if (self) {
//注册通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notice:) name:@"sendMessage" object:nil];
}
return self;
}
总结:另外,通知是同步的,最好保持通知在同一个线程内,以免出现延迟或阻塞
相关文章推荐
- ios NSThred多线程简单使用
- IOS Dev Intro - Color Space Convertion
- iOS - Modal后控制器的关系 及 modal后不移除后面的控件
- iOS每日一记————————一些自己的看法....Orz
- iOS开发路线概述
- iOS tabbarItem的颜色都是白色,点击其中一个,其他的不变,没有点中的效果
- iOS开发 - 模拟苹果通讯录
- iOS 获取当前月份一共多少天 ,获取当前某年某月某日, 当前日期星期几
- ios读写文件NSFileManager
- IOS开发中,SVN如何恢复到某一个版本(以Cornerstone为例)
- 斯坦福大学iOS开发公开课总结(二) :翻纸牌Demo
- 斯坦福大学iOS开发公开课总结(一) :iOS的MVC框架
- iOS-对象为空的判断(nil、null)
- Release:library not found for -lPods-AFNetworking
- ios开发者账号、证书相关内容
- iOS申请邓白氏总结
- iOS内存管理(3)-- iOS 代理要用weak修饰
- iOS 多线程开发(二)
- ios html5 video not full screen
- iOS内存管理(2)-- NSString的copy和strong的用法