通知传值
我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传
通知中心是一个单例,不管在哪个文件注册,也不管注册多少个,通知中心都是同一个。
一. 实现步骤
在界面2注册一个通知中心并指定通知名称,通知的信息就是要传递的数据,发布通知
在界面1注册一个通知中心,添加界面1为观察者,当有相同名字的通知时,就执行指定方法
在实现通知的方法中,进行赋值操作
在界面1中移除通知
二. 通知的优缺点
优点:
代码简洁,实现简单
一对多的方式,对于一个发出的通知,多个对象能够做出反应
控制器能通过通知传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
注:context对象:通俗的理解是一个公共的容器
缺点:
在编译期不会检查通知是否能够被观察者正确的处理,应用的执行过程难跟踪
控制器发出通知后,不能从观察者获得任何的反馈信息
在释放注册的对象时,需要在通知中心取消注册
观察者需要提前知道通知名称和字典各个键名,如果这些不在工作区间内定义,那么会出现不同步的情况
三. 具体代码
1. AppDelegate类
---------- AppDelegate.m文件
#import "AppDelegate.h"
#include "OneViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1. 创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2. 创建窗口的根控制器
// 2.1 创建导航控制器的根控制器
UIViewController *oneVc = [[OneViewController alloc] init];
// 2.2 创建导航控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:oneVc];
// 2.3 给窗口设置根控制器
self.window.rootViewController = nav;
// 3. 设置窗口为主窗口并显示窗口
[self.window makeKeyAndVisible];
// 隐藏导航控制器的导航条
nav.navigationBarHidden = YES;
return YES;
}
@end
2. OneViewController类
---------- OneViewController.m文件
#import "OneViewController.h"
#import "TwoViewController.h"
@interface OneViewController ()
@property (nonatomic,strong) UITextField *textField;
@end
@implementation OneViewController
- (void)viewDidLoad {
[super viewDidLoad];
//设置控制器View的背景颜色
self.view.backgroundColor = [UIColor greenColor];
// 创建点击按钮
UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom];
clickBtn.frame = CGRectMake(10, 100, 80, 40);
clickBtn.backgroundColor = [UIColor whiteColor];
[clickBtn setTitle:@"到界面2" forState:UIControlStateNormal];
[clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:clickBtn];
// 创建文本框
_textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)];
_textField.borderStyle = UITextBorderStyleRoundedRect;
_textField.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_textField];
// 注册一个通知
NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];
// 添加控制为观察者,收到通知就执行changeValue:方法
[notification addObserver:self selector:@selector(changeValue:) name:@"passData" object:nil];
}
#pragma mark - 接收到通知后执行的方法
- (void)changeValue:(NSNotification *) notification {
// 从字典中取值
_textField.text = [notification userInfo][@"info"];
}
#pragma mark - 点击事件
- (void)btnClick {
// 创建界面2,并压入栈
TwoViewController *twoVc = [[TwoViewController alloc] init];
[self.navigationController pushViewController:twoVc animated:YES];
}
-(void)dealloc{
// 移除观察者
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
3. TwoViewController类
---------- TwoViewController.m文件
#import "TwoViewController.h"
@interface TwoViewController ()
@property (nonatomic,strong) UITextField *textField;
@end
@implementation TwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
//设置控制器View的背景颜色
self.view.backgroundColor = [UIColor yellowColor];
// 创建点击按钮
UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom];
clickBtn.frame = CGRectMake(10, 100, 80, 40);
clickBtn.backgroundColor = [UIColor whiteColor];
[clickBtn setTitle:@"传 值" forState:UIControlStateNormal];
[clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:clickBtn];
// 创建文本框
_textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)];
_textField.borderStyle = UITextBorderStyleRoundedRect;
_textField.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_textField];
}
#pragma mark - 点击事件
- (void)btnClick {
// 注册一个通知
NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];
// 发布通知,把要传递的数据存入字典中,
[notification postNotificationName:@"passData" object:self userInfo:@{@"info":_textField.text}];
// 跳转界面
[self.navigationController popViewControllerAnimated:YES];
}
@end