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

原创 2016年08月29日 18:36:39

Block传值

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

一般用Block传值是为了降低视图控制器之间的耦合度,和代理传值类似主要用于逆序传值。

一. 实现步骤

  1. 给界面2定义一个Block属性;注意:在block传值中,要传几个值,block就有几个参数,参数要与传的值对应

  2. 在界面2的跳转方法中检查block属性是否有值,有值就执行block,然后界面2出栈

  3. 在界面1的跳转方法中创建界面2,并把要执行的赋值语句保存到界面2的block变量属性

二. 具体代码

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];

}

#pragma mark - 点击事件

- (void)btnClick {

  // 创建界面2,并压入栈
  TwoViewController *twoVc = [[TwoViewController alloc] init];
  [self.navigationController pushViewController:twoVc animated:YES];

  // 给界面的Block设置传值代码块
  twoVc.twoBlock = ^(NSString *str){
    // 用界面2的值赋给界面1的文本框,这句代码是在界面1中执行的
    _textField.text = str;
  };

}

@end

3. TwoViewController类

---------- TwoViewController.h文件

#import <UIKit/UIKit.h>

// 自定义一个Block变量类型名
typedef void(^TwoViewControllerBlock)(NSString *);

@interface TwoViewController : UIViewController

// Block属性
@property (nonatomic,strong) TwoViewControllerBlock twoBlock;

@end

---------- TwoViewController.h文件

#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 {

  // 如果Block有值就执行Block
  if (_twoBlock) {
    // 传入文本框的值传到界面1
    _twoBlock(_textField.text);
  }

  // 跳转界面
  [self.navigationController popViewControllerAnimated:YES];

}

@end
版权声明:本文为博主原创文章,未经博主允许不得转载。

SpringMVC 控制器向视图传值的方式

在SpringMVC中,控制器向视图传值一般有三中方式,分别是通过ModelAndView、ModelMap、Session,下面将讲述三种传值方式ModelAndView将控制器方法的返回值设为Mo...
  • u011403655
  • u011403655
  • 2015年06月02日 22:58
  • 2576

ios控制器之间传值-Block传值

一、在发送者中定义代码块属性 @property (nonatomic,copy) void (^changeBgColor)(UIColor *color); 二、在发送者中进行代码块的调用...
  • Fantasy_Jun
  • Fantasy_Jun
  • 2017年04月24日 18:13
  • 166

Block的使用--页面传值方法及探究

上一篇讲了Block的简单实用,这一篇则是讲述Block的最经常也是比较简单的用法,个人认为这是block相对其他页面传值方式比较好的一个用处。也顺便总结下这两天对Block的理解的一些注意点。对于页...
  • CNLF14
  • CNLF14
  • 2015年07月27日 18:02
  • 1487

iOS-Block总结 && 全面解析逆向传值

1、block的特点:      block是C语言;      block是一种数据类型、可以当做参数,也可以用做返回值;——总之,对比int的用法用即可(当然,定义的时候,最好跟函数对比); ...
  • yang198907
  • yang198907
  • 2015年12月06日 22:59
  • 2849

iOS开发总结之控制器之间传值的8种方式

1.前言 项目开发当中往往会遇到控制器之间的传值,总结了一下总共有如下6种传递方式(包括顺传和逆传) 代理 、 单粒 、通知 、 kvc 、 block  和  NSUserDefaults 这6种方...
  • sunnyboy9
  • sunnyboy9
  • 2016年04月27日 22:00
  • 2302

angular 控制器之间的通信

1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子...
  • yy374864125
  • yy374864125
  • 2014年09月15日 09:57
  • 12666

springMVC视图层和控制器层之间参数传递

springMVC视图层和控制器层之间参数传递
  • nengyu
  • nengyu
  • 2016年07月06日 23:17
  • 1586

控制器之间的数据传递——自定义单例传值

自定义单例传值 前面的几篇文章介绍了通过系统提供的单例进行数据传递,如:UIApplication、通知等,这篇文章介绍使用自定义的单例进行数据传递 我们先在这里约定:界面1传值到界面2为顺传,界...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月30日 08:47
  • 530

控制器之间的数据传递——全局变量传值

全局变量传值 一. 实现步骤 在界面2中声明一个全局变量,并且用它赋值保存要穿的值 在界面1中用extern声明界面2中的全局变量,就可用他保存的值赋值 二. extern优缺点 ...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月29日 22:33
  • 1008

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

通知传值我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传通知中心是一个单例,在哪里注册通知中心,通知中心都是同一个。一. 实现步骤 在界面2注册一个通知中心并指定通知名称,通知的信...
  • SSIrreplaceable
  • SSIrreplaceable
  • 2016年08月29日 21:13
  • 650
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:控制器之间的数据传递——Block传值
举报原因:
原因补充:

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