回传值问题,一直都是困扰初学者的问题,今写者 代理、通知、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)的更多相关文章

  1. 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

    首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...

  2. iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值

    有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳 ...

  3. iOS 代理与block 逆向传值 学习

    一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己 ...

  4. 四大传值详解:属性传值,单例传值,代理传值,block传值

    一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...

  5. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  6. asp.net中父子页面通过gridview中的按钮事件进行回传值的问题

    这两天写BS程序,遇到父子页面传值的问题,以前没写过web系统,用了几天时间才将问题解决,总结下记录下来: 问题描述: 父页面A中有一个gridview,每行6个列,有5列中均有一个按钮,单击按钮,会 ...

  7. iOS 页面间传值 之 属性传值,代理传值

    手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但 ...

  8. 在多个Activity中回传值(startActivityForResult())

    业务逻辑: MainActivity打开A,A打开B,B把值传回MainActivity.适用在多个Activity中回传值. 实例:微信中选择国家-->省份-->城市的实现 实现方式分析 ...

  9. linux 中 ping的回传值

      今天在学习鸟哥私房菜的过程中,不明白ping的回传值是怎么设置的,后来网上找的结果了,特此记录一下 1 题目大意是指,ping一个网段的机器,如果可以通,就显示UP,如果不通就显示Down,其中一 ...

随机推荐

  1. forever 使用

    安装: $npm install -g forever y@y:ydkt$ forever start server/app.js warn: --minUptime not set. Default ...

  2. [Android] AudioTrack实例

    AudioTrack在Android系统中是用于PCM数据的混音.播放,并不涉及到音频的解码.因此MP3这类经过编码的音频格式文件不能直接通过AudioTrack正确地播放,AudioTrack只能播 ...

  3. ehci符合USB2.0,uhci,ohci,

    uhci   ohci   ehci他们都是主机控制器的规格,OHCI主要为非PC系统上以及带有SiShe ALi芯片组的 PC主板上的USB芯片,UHCI大多为Intel和Via主板上的USB控制器 ...

  4. jstat(JVM Statistics Monitoring Tool)

    功能   用于监视虚拟机各种运行状态信息的命令行工具.它可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运 ...

  5. 实Schur分解

        前面已经说过LU,Cholesky和QR分解,这次介绍的是实Schur分解.对这个分解的定义是任意一个矩阵A,可有如下形式的分解:               U*A*U' = B;其中B是拟 ...

  6. 《Linear Algebra and Its Applications》-chaper2-矩阵代数中的基本性质

    之前我们曾经提及,完成了线性方程组-向量方程-矩阵方程的等价转化之后,我们对于现实问题中的线性方程组,只需将其转移到矩阵(向量)方程,然后利用矩阵代数中的各种方法和性质进行计算或者化简即可,而下面我们 ...

  7. powershell利用winform批量执行tsql语句

    #加载.net的winform模块 [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $app= ...

  8. 如何用命令将本地项目上传到git

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  9. C++读写文件并排序

    比如一条记录是 1987 9 2 1988 8 26 代表公司员工生日 然后需要读入到系统 现在需要放入容器,并且排序 最后输出到新的文件中,按照年龄由大到小. #include "stda ...

  10. Java中迭代列表中数据时几种循环写法的效率比较

    Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较.虽然网上已经有了类似的文章,但是对他们的结论并不认同. 常见的实现方法: 1.for循环: for(int i = 0; i ...