回传值(代理、通知、block)
回传值问题,一直都是困扰初学者的问题,今写者 代理、通知、block 三者的回传值做了一个小小的总结,
Main.storyboard 视图:
通过代码分别创建三个代表 代理、通知、block 的按钮,点击相应的按钮,会将相应的文本传入文本框中显示出来
代码如下:
// GWFMyDelegateBlockNotyView.h
// 回传值 #import <UIKit/UIKit.h>
@class GWFMyDelegateBlockNotyView; //协议
@protocol GWFMyDelegateBlockNotyViewDelegate <NSObject> //定义代理方法
-(void)GWFMyDelegateBlockNotyView:(GWFMyDelegateBlockNotyView *)view andString:(NSString *)string andImage:(UIImage *)image; @end @interface GWFMyDelegateBlockNotyView : UIView //定义 id 属性
@property (nonatomic,weak) id <GWFMyDelegateBlockNotyViewDelegate> myDelegate; //添加 block 属性
@property (nonatomic,copy) void (^myBlock)(NSString *,UIImage *); @end
// GWFMyDelegateBlockNotyView.m
// 回传值 #import "GWFMyDelegateBlockNotyView.h"
#import "SVProgressHUD.h"
#import "MBProgressHUD+Ex.h" @implementation GWFMyDelegateBlockNotyView - (instancetype)init
{
self = [super init];
if (self) { #pragma ==================================== 代理传值按钮 //1.创建 delegateBtn
UIButton *deleBtn = [[UIButton alloc] initWithFrame:CGRectMake(, , , )];
//设置背景颜色
deleBtn.backgroundColor = [UIColor redColor];
//设置title
[deleBtn setTitle:@"代理传值" forState:UIControlStateNormal];
//设置 title 的颜色
[deleBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; //添加到控制器上
[self addSubview:deleBtn]; //添加 deleBtn 的监听事件
[deleBtn addTarget:self action:@selector(deleBtnClick) forControlEvents:UIControlEventTouchUpInside]; #pragma ==================================== Block传值按钮 //2.创建 Block 按钮
UIButton *blockBtn = [[UIButton alloc] initWithFrame:CGRectMake(, , , )];
//设置背景颜色
blockBtn.backgroundColor = [UIColor greenColor];
//设置 title
[blockBtn setTitle:@"Block传值" forState:UIControlStateNormal];
//设置 title 的颜色
[blockBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; //添加到控制器上
[self addSubview:blockBtn]; //添加 blockBtn 的监听事件
[blockBtn addTarget:self action:@selector(blockBtnClick) forControlEvents:UIControlEventTouchUpInside]; #pragma ==================================== 通知传值按钮 //3.创建 notyBtn
UIButton *notyBtn = [[UIButton alloc] initWithFrame:CGRectMake(, , , )];
//设置背景颜色
notyBtn.backgroundColor = [UIColor blueColor];
//设置 title
[notyBtn setTitle:@"通知传值" forState:UIControlStateNormal];
//设置 notyBtn 的 title 的颜色
[notyBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; //添加到控制器上
[self addSubview:notyBtn]; //添加 notyBtn 的监听事件
[notyBtn addTarget:self action:@selector(notyBtnClick) forControlEvents:UIControlEventTouchUpInside]; }
return self;
} //实现按钮的点击事件
#pragma mark -------代理 -(void)deleBtnClick {
NSString *myText = @"这是代理传来的值";
UIImage *image = [UIImage imageNamed:@"0 (3)"]; //判断代理
if ([self.myDelegate respondsToSelector:@selector(GWFMyDelegateBlockNotyView:andString:andImage:)]) { //执行代理
[self.myDelegate GWFMyDelegateBlockNotyView:self andString:myText andImage:image]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [SVProgressHUD showWithStatus:@"正在连接..." maskType:SVProgressHUDMaskTypeBlack];
}); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss];
UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"http://www.dianping.com"];
[app openURL:url]; });
}
} #pragma mark -------block -(void)blockBtnClick {
NSString *myText = @"这是Block传来的值";
UIImage *image = [UIImage imageNamed:@"0 (2)"];
self.myBlock(myText,image); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [SVProgressHUD showWithStatus:@"正在连接..." maskType:SVProgressHUDMaskTypeBlack];
}); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"http://www.10010.com"];
[app openURL:url]; });
} #pragma mark --------通知 -(void)notyBtnClick {
NSString *myText = @"这是通知传来的值";
UIImage *image = [UIImage imageNamed:@"0 (7)"]; //发布一个通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"myNoty" object:nil userInfo:@{@"myText":myText,@"image":image}]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [SVProgressHUD showWithStatus:@"正在连接..." maskType:SVProgressHUDMaskTypeBlack];
}); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; UIApplication *app = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"http://www.youku.com"];
[app openURL:url]; });
} @end
控制器中:
// ViewController.m
// 回传值 #import "ViewController.h"
#import "GWFMyDelegateBlockNotyView.h" @interface ViewController ()<GWFMyDelegateBlockNotyViewDelegate> @property (weak, nonatomic) IBOutlet UILabel *myLabel;
@property (weak, nonatomic) IBOutlet UIImageView *myImageView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.view.backgroundColor = [UIColor orangeColor];
//添加 myView
GWFMyDelegateBlockNotyView *myView = [[GWFMyDelegateBlockNotyView alloc] init];
myView.frame = CGRectMake(, , , );
[self.view addSubview:myView]; //设置代理
myView.myDelegate = self; //block
myView.myBlock = ^(NSString *block,UIImage *myBlock){
self.myLabel.text = block;
self.myImageView.image = myBlock;
}; //添加通知的一个监听事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noty:) name:@"myNoty" object:nil]; } //实现代理方法
-(void)GWFMyDelegateBlockNotyView:(GWFMyDelegateBlockNotyView *)view andString:(NSString *)string andImage:(UIImage *)image {
self.myLabel.text = string;
self.myImageView.image = image;
} //实现通知的监听方法
-(void)noty:(NSNotification *)noty {
self.myLabel.text = noty.userInfo[@"myText"];
self.myImageView.image = noty.userInfo[@"image"];
} @end
执行结果:
1> 点击代理按钮后:

2> 点击通知按钮后:

3>点击block按钮后:

回传值(代理、通知、block)的更多相关文章
- 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,
首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...
- iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值
有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳 ...
- iOS 代理与block 逆向传值 学习
一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己 ...
- 四大传值详解:属性传值,单例传值,代理传值,block传值
一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...
- Android 组件系列-----Activity的传值和回传值
在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...
- asp.net中父子页面通过gridview中的按钮事件进行回传值的问题
这两天写BS程序,遇到父子页面传值的问题,以前没写过web系统,用了几天时间才将问题解决,总结下记录下来: 问题描述: 父页面A中有一个gridview,每行6个列,有5列中均有一个按钮,单击按钮,会 ...
- iOS 页面间传值 之 属性传值,代理传值
手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但 ...
- 在多个Activity中回传值(startActivityForResult())
业务逻辑: MainActivity打开A,A打开B,B把值传回MainActivity.适用在多个Activity中回传值. 实例:微信中选择国家-->省份-->城市的实现 实现方式分析 ...
- linux 中 ping的回传值
今天在学习鸟哥私房菜的过程中,不明白ping的回传值是怎么设置的,后来网上找的结果了,特此记录一下 1 题目大意是指,ping一个网段的机器,如果可以通,就显示UP,如果不通就显示Down,其中一 ...
随机推荐
- uva 10820 (筛法构造欧拉函数)
send a table When participating in programming contests, you sometimes face the following problem: Y ...
- jquery-object.js
/** * jQuery.query - Query String Modification and Creation for jQuery * Written by Blair Mitchelmor ...
- 仿微博——MJExtension之字典转模型
1.模型类中定义好属性 2.用AFN请求下来的数据保存到字典中 3.从字典中取出微博字典数组 //微博字典数组 NSArray *restrictArray = responseObject[@&qu ...
- mongodb 教程一
mongodb是nosql(not only sql)的一种方式 .是对不同于传统的关系型数据库的数据库管理系统的统称. NoSQL - 代表着不仅仅是SQL- 没有声明性查询语言- 没有预定义的模式 ...
- 转:WebSocket与Java
Bozhidar Bozhanov是Ontotext AD的高级软件工程师,拥有多年的从业经验,也是stackoverflow上的活跃用户.他精通于Java与Java技术栈,如Spring.JPA.J ...
- 关于function与closure
function 方式 scope function closure expression anonymous function class(this, prototype)
- BZOJ 3065 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 思路:替罪羊树套权值线段树. 当替罪羊树某个子树大于某个比利(比例)时就暴力重构,本题时间复杂 ...
- Javascript语法基础
Javascript语法基础 一.基本数据类型 JavaScript中支持数字.字符串和布尔值三种基本数据类型: 1.数字 数字型是JavaScript中的基本数据类型.在JavaScript ...
- Java---IO加强(2)
转换流 ★转换流功能1:充当字节流与字符流之间的桥梁 需求:模拟英文聊天程序,要求: (1) 从键盘录入英文字符,每录一行就把它转成大写输出到控制台: (2) 保存聊天记录到字节流文件. 要求1的设计 ...
- 【用PS3手柄在安卓设备上玩游戏系列】谈安卓游戏对手柄的支持
不同的游戏对于手柄的支持程度是不一样的,对应所需要进行的手柄设置也不尽相同.我没有这样的时间和精力,针对每一款游戏去写博客,但找出不同游戏中的共同点,针对同一类的游戏去写博客,应该是可行的.我把安卓上 ...