控制器之间的数据传递——通知传值

原创 2016年08月29日 21:13:54

通知传值

我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传

通知中心是一个单例,不管在哪个文件注册,也不管注册多少个,通知中心都是同一个。

一. 实现步骤

  1. 在界面2注册一个通知中心并指定通知名称,通知的信息就是要传递的数据,发布通知

  2. 在界面1注册一个通知中心,添加界面1为观察者,当有相同名字的通知时,就执行指定方法

  3. 在实现通知的方法中,进行赋值操作

  4. 在界面1中移除通知

二. 通知的优缺点

优点:

  1. 代码简洁,实现简单

  2. 一对多的方式,对于一个发出的通知,多个对象能够做出反应

  3. 控制器能通过通知传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
    注:context对象:通俗的理解是一个公共的容器

缺点:

  1. 在编译期不会检查通知是否能够被观察者正确的处理,应用的执行过程难跟踪

  2. 控制器发出通知后,不能从观察者获得任何的反馈信息

  3. 在释放注册的对象时,需要在通知中心取消注册

  4. 观察者需要提前知道通知名称和字典各个键名,如果这些不在工作区间内定义,那么会出现不同步的情况

三. 具体代码

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
版权声明:本文为博主原创文章,未经博主允许不得转载。

两个控制器之间8种传值的方式:

1.单例  2.通知  3.代理 4.在viewwilldisappear方法中传值 5.uiapplication是单例 通过这个取出控制器然后传值 ...
  • ft6206
  • ft6206
  • 2016年10月23日 10:15
  • 439

控制器的数据传递

控制器的数据传递实现
  • ITcontend
  • ITcontend
  • 2014年12月04日 09:52
  • 716

控制器之间的数据传递——storyboard中控制器的数据传递

在APP开发中,我们经常需要在不同的控制器之间进行数据传递,按照传递的方向,可分为顺传和逆传;按照是否通过第三者(如通过单例、或者文件等)传递数据,可以分为:直接传递和间接传递。 一. 在st...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月29日 14:51
  • 918

控制器之间的数据传递——属性传值

一、属性传值 我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传 (一). 顺传 界面2需要有一个用于接收数据的属性 界面2在压入栈之前,把界面1中的数据直接赋值给界面2...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月29日 16:52
  • 1008

ios控制器之间传值-通知传值

第1步:在发送者中实现一个方法进行发送通知。 NSDictionary *dict = @{@"color":color, @"userName":@"haha"}; [[NSNotificatio...
  • Fantasy_Jun
  • Fantasy_Jun
  • 2017年04月24日 18:20
  • 274

控制器之间的数据传递——Block传值

Block传值 我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传 一般用Block传值是为了降低视图控制器之间的耦合度,和代理传值类似主要用于逆序传值。 一. 实现步骤: ...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月29日 18:36
  • 991

控制器之间的数据传递——代理传值

代理传值我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传 一般用代理传值是为了降低视图控制器之间的耦合度,主要用于逆序传值。 对于属性传值,传递方必须要有一个保存接收...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月29日 18:07
  • 478

iOS多界面传值之--通知传值

通知传值通知传值也是逆向传值的一种,即第二界面向第一界面传值 谁要监听值的变化,谁就注册通知 特别要注意,通知的接受者必须存在这一条件 1.注册通知 2.通知中心发送通知消息,其中name(通知...
  • qq_34478149
  • qq_34478149
  • 2016年09月11日 15:19
  • 790

综述种类:Android组件之间 数据传递方法

博客源址:activity之间的数据传递方法 博客时间:2012-06-06 18:27 1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般...
  • Buaaroid
  • Buaaroid
  • 2015年11月05日 17:20
  • 2761

类和类之间传递参数

方法一:       使用继承和超类 class test1 { int j = 10; } //你也可以用继承,下面引用超类变量 super.j; public class My...
  • csdn13257081409
  • csdn13257081409
  • 2017年10月26日 16:12
  • 47
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:控制器之间的数据传递——通知传值
举报原因:
原因补充:

(最多只允许输入30个字)