效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制器里面分别有一个输入框,输入文字后 点击完成,把文本框输入的内容回调到  VIewController里面的 Lab上显示出来!

第一种:delegate回调

1.首先在oneViewController.h里面声明代理

#import <UIKit/UIKit.h>

//协议

@protocol OneViewDelegate

//代理方法

-(void)returnFieldText:(NSString*)string;

@end

@interface OneViewController : UIViewController

//声明属性

@property(nonatomic,strong)id <OneViewDelegate>delegate;

@end

2.实现代理

#import "OneViewController.h"

@interface OneViewController ()

@property(nonatomic,strong)UITextField *textField;

@end

@implementation OneViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

self.textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 100, 30)];

self.textField.backgroundColor = [UIColor greenColor];

[self.view addSubview:self.textField];

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(doRightButtonAction)];

self.navigationItem.rightBarButtonItem = rightButton;

}

-(void)doRightButtonAction{

NSLog(@"这是第二步");

[self.delegate returnFieldText:self.textField.text];

[self.navigationController popViewControllerAnimated:YES];

}

3. 在ViewController回调

#import "ViewController.h"

#import "OneViewController.h"

@interface ViewController ()<BlockViewDelegate>

@property(nonatomic,strong)UILabel *lab;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

btn.frame=CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);

[btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:btn];

self.lab=[[UILabel alloc]initWithFrame:CGRectMake(0, 80, 200, 50)];

self.lab.backgroundColor=[UIColor redColor];

[self.view addSubview:self.lab];

}

-(void)back{

OneViewController *one=[[OneViewController alloc]init];

one.delegate = self; (注意:控制器入栈,这个必须写)

[self.navigationController pushViewController:one animated:YES];

}

//代理回调

-(void)returnFieldText:(NSString *)string{

NSLog(@"这是第3");

[self.lab setText:string];

}

第二种 Block回调

1.声明block

#import <UIKit/UIKit.h>

//声明别名ReturnTextWithBlock

typedef void (^ReturnTextWithBlock)(NSString *text);

@interface BlockViewController : UIViewController

//属性

(注意:block修饰必须用copy,不然会出问题)

@property(nonatomic,copy)ReturnTextWithBlock  returnTextBlock;

//方法

-(void)returnTextFieldWithBlock:(ReturnTextWithBlock)block;

@end

2.实现ReturnTextWithBlock

#import "BlockViewController.h"

@interface BlockViewController ()

@property(nonatomic,strong)UITextField *textField;

@end

@implementation BlockViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

self.textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 100, 30)];

self.textField.backgroundColor = [UIColor greenColor];

[self.view addSubview:self.textField];

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(doRightButtonAction)];

self.navigationItem.rightBarButtonItem = rightButton;

}

-(void)doRightButtonAction{

NSLog(@"第2");

self.returnTextBlock(self.textField.text);

[self.navigationController popViewControllerAnimated:YES];

}

-(void)returnTextFieldWithBlock:(ReturnTextWithBlock)block{

NSLog(@"第1");

block是存在栈区的,随着viewDidLoad消失会消失,我们要操作 将它放入堆区,赋值  引用计数加1 ,不会导致中途丢失

self.returnTextBlock = block;

}

3.回调实现block

#import "ViewController.h"

#import "BlockViewController.h"

@interface ViewController ()

@property(nonatomic,strong)UILabel *lab;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

btn.frame=CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);

[btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:btn];

self.lab=[[UILabel alloc]initWithFrame:CGRectMake(0, 80, 200, 50)];

self.lab.backgroundColor=[UIColor redColor];

[self.view addSubview:self.lab];

}

-(void)back{

BlockViewController *BlockVC=[[BlockViewController alloc]init];

__weak typeof (self)weakSelf = self;

//回调block

[BlockVC returnTextFieldWithBlock:^(NSString *text) {

[weakSelf.lab setText:text];

}];

[self.navigationController pushViewController:BlockVC animated:YES];

}

@end

传值的话:还有属性,通知等传值方式

63.delegate回调 和block回调的更多相关文章

  1. Block回调

    •Block的定义   •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现    ...

  2. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  3. 代码块(Block)回调一般阐述

    本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...

  4. iOS开发-Block回调

    关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...

  5. Objective-C中的Block回调模式

    在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...

  6. UIAlertController——之Block回调

    iOS8.0之后出现的提示框 =.=,比自己去改block回调要好.

  7. block回调具体例子

    //main.m ////  main.m//  回调////  Created by hehe on 15/9/10.//  Copyright (c) 2015年 wang.hehe. All r ...

  8. 第十篇、自定义UIBarButtonItem和UIButton block回调

    // 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...

  9. iOS很重要的 block回调

    刚刚进入ios开发行业,发现开发中要用到大量的block回调,由此可见它的重要性.学习它之前我也是网上找的资料,推荐这篇文章http://blog.csdn.net/mobanchengshuang/ ...

随机推荐

  1. 优化-最小化损失函数的三种主要方法:梯度下降(BGD)、随机梯度下降(SGD)、mini-batch SGD

    优化函数 损失函数 BGD 我们平时说的梯度现将也叫做最速梯度下降,也叫做批量梯度下降(Batch Gradient Descent). 对目标(损失)函数求导 沿导数相反方向移动参数 在梯度下降中, ...

  2. TZOJ 4085 Drainage Ditches(最大流)

    描述 Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. Th ...

  3. 数据库(mysql)

    一.left join  right join  inner join left join(左连接),在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录. right join(右 ...

  4. Android Studio无法打印Logout日志

    华为手机: 在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面,然后Project Menu → 后台设置 → LOG设置LOG 开关 → LOG 打开        LOG 级别设置 ...

  5. JSP中的数据库操作,MySQL基础操作(一)

    一.JDBC JDBC(java data base concectivity),是一种用于执行SQL语句的java API,可以为多种关系库提供统一访问. 通常使用JDBC完成以下操作: 1)同数据 ...

  6. ELK日志系统:Filebeat使用及Kibana如何设置登录认证(转)

    原文地址:http://www.cnblogs.com/yjmyzz/p/filebeat-turorial-and-kibana-login-setting-with-nginx.html 根据el ...

  7. gearman的持久化,以mysql的方式

    1.为什么要持久化? gearman的job server中的工作队列存储在内存中,一旦服务器有未处理的任务时重启或者宕机,那么这些任务就会丢失.持久化存储队列可以允许添加后台任务,并将其存储在外部的 ...

  8. Aspose.words一 DOM结构

    2.文档对象模型概述 2.1 DOM介绍 Aspose.Words的文档对象模型(以下简称DOM)是一个Word文档在内存中的映射,Aspose.Words的DOM可以编程读取.操作和修改Word文档 ...

  9. Sonar配置与使用

    一.前置条件: 安装工具如下: JDK MySql服务器 SonarQube SonarScanner 从官网下载安装包进行安装,具体安装步骤略 二.配置 MySql配置: 打开SQL,创建sonar ...

  10. devexpress WinForms MVVM

    WinForms MVVM This section is dedicated to the Model-View-ViewModel (MVVM) architectural pattern. Yo ...