63.delegate回调 和block回调
效果: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回调的更多相关文章
- Block回调
•Block的定义 •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现 ...
- iOS 键盘添加完成按钮,delegate和block回调
这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...
- 代码块(Block)回调一般阐述
本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...
- iOS开发-Block回调
关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...
- Objective-C中的Block回调模式
在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...
- UIAlertController——之Block回调
iOS8.0之后出现的提示框 =.=,比自己去改block回调要好.
- block回调具体例子
//main.m //// main.m// 回调//// Created by hehe on 15/9/10.// Copyright (c) 2015年 wang.hehe. All r ...
- 第十篇、自定义UIBarButtonItem和UIButton block回调
// 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...
- iOS很重要的 block回调
刚刚进入ios开发行业,发现开发中要用到大量的block回调,由此可见它的重要性.学习它之前我也是网上找的资料,推荐这篇文章http://blog.csdn.net/mobanchengshuang/ ...
随机推荐
- Vue之常用语法
变量的定义: var定义的变量:只有全局作用域和函数作用域.有变量提升,先打印后定义变量不会报错,打印结果为undefined let定义的变量:没有变量提升 ——>有局 ...
- POJ-2251.DungeonMaster(三维BFS)
做题时需要注意,爬楼有向上和向下爬之分... 本题大意:输入 l, r, c, 分别代表地牢的楼层数和每层地牢的长和宽,地牢由rock and point and source and key组成,你 ...
- 打印信息,通过.jasper工具将集合输出到PDF文件 然后利用打印机打印文件
我们上一次成功的利用iReport工具制作了一张报表,并且预览了报表最后的效果,也生成了格式为“jrpxml”.“jrxml”与“jasper”的文件.这次,我们使用jasper提供的java的api ...
- how2j网站前端项目——天猫前端(第一次)学习笔记6
开始我的订单页面 学着学着,会觉得我这是在干啥呢?我要学的是Java不是吗?怎么要学这么久的前端啊?说实话,我很迷茫,不知道以后的工作具体是做什么?学的这些能用到吗? 不过,还是要把这个项目跟着走完! ...
- how2j网站前端项目——天猫前端(第一次)学习笔记5
收拾好心情,现在开始学习第5个页面——购物车页面! 一.结算按钮 这个还是比较简单的,我自己看着站长的样子模仿了一个: 有个地方不会做,就是全选前面的复选框,站长的框里面是白色的,我搞不来. 二.订单 ...
- Linux用7zip解压缩分卷文件
背景:在服务器迁移过程中,有大量非结构化文件(主要是office文档和图片),目录结构太大,高达80-100G,传输耗时且容易受网络 等其他原因意外中断,以致于传输失败,于是采用分卷压缩,即使传输失败 ...
- pycharm 配置支持vue
http://www.cnblogs.com/c-x-m/p/9229199.html
- 9.13 h5日记
9.13 面试题 为什么两个P出此案的效果不同,原因是 浏览器在解析第二个P的时候,因为字母没有空格,浏览器会认为这个单词没有打完,所以不会换行. 列表 ul ol dl li 1.无序列表 ul ( ...
- vue 环境搭建
目前我们的项目前端都采用的是vue js为了方便开发过程中前后端同事进行功能对接,建议每个同事都准备好前后端环境(前端的同事参考文档第二部分,后端同事请参考第一部分),只要保持前后端代码是最新的就可以 ...
- 未能找到 CodeDom 提供程序类型“Microsoft.VJSharp.VJSharpCodeProvider,
错误 1 未能找到 CodeDom 提供程序类型“Microsoft.VJSharp.VJSharpCodeProvider, VJSharpCodeProvider, Version=2.0.0.0 ...