回传值(代理、通知、block)

回传值问题,一直都是困扰初学者的问题,今写者 代理、通知、block 三者的回传值做了一个小小的总结,

Main.storyboard 视图:

通过代码分别创建三个代表 代理、通知、block 的按钮,点击相应的按钮,会将相应的文本传入文本框中显示出来

代码如下:

 1 //  GWFMyDelegateBlockNotyView.h
 2 //  回传值
 3
 4 #import <UIKit/UIKit.h>
 5 @class GWFMyDelegateBlockNotyView;
 6
 7 //协议
 8 @protocol GWFMyDelegateBlockNotyViewDelegate <NSObject>
 9
10 //定义代理方法
11 -(void)GWFMyDelegateBlockNotyView:(GWFMyDelegateBlockNotyView *)view andString:(NSString *)string andImage:(UIImage *)image;
12
13 @end
14
15 @interface GWFMyDelegateBlockNotyView : UIView
16
17 //定义 id 属性
18 @property (nonatomic,weak) id <GWFMyDelegateBlockNotyViewDelegate> myDelegate;
19
20 //添加 block 属性
21 @property (nonatomic,copy) void (^myBlock)(NSString *,UIImage *);
22
23 @end
  1 //  GWFMyDelegateBlockNotyView.m
  2 //  回传值
  3
  4 #import "GWFMyDelegateBlockNotyView.h"
  5 #import "SVProgressHUD.h"
  6 #import "MBProgressHUD+Ex.h"
  7
  8 @implementation GWFMyDelegateBlockNotyView
  9
 10 - (instancetype)init
 11 {
 12     self = [super init];
 13     if (self) {
 14
 15 #pragma ==================================== 代理传值按钮
 16
 17         //1.创建 delegateBtn
 18         UIButton *deleBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
 19         //设置背景颜色
 20         deleBtn.backgroundColor = [UIColor redColor];
 21         //设置title
 22         [deleBtn setTitle:@"代理传值" forState:UIControlStateNormal];
 23         //设置 title 的颜色
 24         [deleBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
 25
 26         //添加到控制器上
 27         [self addSubview:deleBtn];
 28
 29         //添加 deleBtn 的监听事件
 30         [deleBtn addTarget:self action:@selector(deleBtnClick) forControlEvents:UIControlEventTouchUpInside];
 31
 32 #pragma ==================================== Block传值按钮
 33
 34         //2.创建 Block 按钮
 35         UIButton *blockBtn = [[UIButton alloc] initWithFrame:CGRectMake(110, 0, 100, 100)];
 36         //设置背景颜色
 37         blockBtn.backgroundColor = [UIColor greenColor];
 38         //设置 title
 39         [blockBtn setTitle:@"Block传值" forState:UIControlStateNormal];
 40         //设置 title 的颜色
 41         [blockBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
 42
 43         //添加到控制器上
 44         [self addSubview:blockBtn];
 45
 46         //添加 blockBtn 的监听事件
 47         [blockBtn addTarget:self action:@selector(blockBtnClick) forControlEvents:UIControlEventTouchUpInside];
 48
 49 #pragma ==================================== 通知传值按钮
 50
 51         //3.创建 notyBtn
 52         UIButton *notyBtn = [[UIButton alloc] initWithFrame:CGRectMake(215, 0, 100, 100)];
 53         //设置背景颜色
 54         notyBtn.backgroundColor = [UIColor blueColor];
 55         //设置 title
 56         [notyBtn setTitle:@"通知传值" forState:UIControlStateNormal];
 57         //设置 notyBtn 的 title 的颜色
 58         [notyBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
 59
 60         //添加到控制器上
 61         [self addSubview:notyBtn];
 62
 63         //添加 notyBtn 的监听事件
 64         [notyBtn addTarget:self action:@selector(notyBtnClick) forControlEvents:UIControlEventTouchUpInside];
 65
 66     }
 67     return self;
 68 }
 69
 70 //实现按钮的点击事件
 71 #pragma mark -------代理
 72
 73 -(void)deleBtnClick {
 74     NSString *myText = @"这是代理传来的值";
 75     UIImage *image = [UIImage imageNamed:@"0 (3)"];
 76
 77     //判断代理
 78     if ([self.myDelegate respondsToSelector:@selector(GWFMyDelegateBlockNotyView:andString:andImage:)]) {
 79
 80         //执行代理
 81         [self.myDelegate GWFMyDelegateBlockNotyView:self andString:myText andImage:image];
 82
 83         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 84
 85             [SVProgressHUD showWithStatus:@"正在连接..." maskType:SVProgressHUDMaskTypeBlack];
 86         });
 87
 88         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 89
 90             [SVProgressHUD dismiss];
 91             UIApplication *app = [UIApplication sharedApplication];
 92             NSURL *url = [NSURL URLWithString:@"http://www.dianping.com"];
 93             [app openURL:url];
 94
 95         });
 96     }
 97 }
 98
 99 #pragma mark -------block
100
101 -(void)blockBtnClick {
102     NSString *myText = @"这是Block传来的值";
103     UIImage *image = [UIImage imageNamed:@"0 (2)"];
104     self.myBlock(myText,image);
105
106     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
107
108         [SVProgressHUD showWithStatus:@"正在连接..." maskType:SVProgressHUDMaskTypeBlack];
109     });
110
111     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
112
113         [SVProgressHUD dismiss];
114
115         UIApplication *app = [UIApplication sharedApplication];
116         NSURL *url = [NSURL URLWithString:@"http://www.10010.com"];
117         [app openURL:url];
118
119     });
120 }
121
122 #pragma mark --------通知
123
124 -(void)notyBtnClick {
125     NSString *myText = @"这是通知传来的值";
126     UIImage *image = [UIImage imageNamed:@"0 (7)"];
127
128     //发布一个通知
129     [[NSNotificationCenter defaultCenter] postNotificationName:@"myNoty" object:nil userInfo:@{@"myText":myText,@"image":image}];
130
131     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
132
133         [SVProgressHUD showWithStatus:@"正在连接..." maskType:SVProgressHUDMaskTypeBlack];
134     });
135
136     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
137
138         [SVProgressHUD dismiss];
139
140     UIApplication *app = [UIApplication sharedApplication];
141     NSURL *url = [NSURL URLWithString:@"http://www.youku.com"];
142     [app openURL:url];
143
144     });
145 }
146
147 @end

控制器中:

 1 //  ViewController.m
 2 //  回传值
 3
 4 #import "ViewController.h"
 5 #import "GWFMyDelegateBlockNotyView.h"
 6
 7 @interface ViewController ()<GWFMyDelegateBlockNotyViewDelegate>
 8
 9 @property (weak, nonatomic) IBOutlet UILabel *myLabel;
10 @property (weak, nonatomic) IBOutlet UIImageView *myImageView;
11
12 @end
13
14 @implementation ViewController
15
16 - (void)viewDidLoad {
17     [super viewDidLoad];
18
19     self.view.backgroundColor = [UIColor orangeColor];
20     //添加 myView
21     GWFMyDelegateBlockNotyView *myView = [[GWFMyDelegateBlockNotyView alloc] init];
22     myView.frame = CGRectMake(30, 150, 300, 200);
23     [self.view addSubview:myView];
24
25     //设置代理
26     myView.myDelegate = self;
27
28     //block
29     myView.myBlock = ^(NSString *block,UIImage *myBlock){
30         self.myLabel.text = block;
31         self.myImageView.image = myBlock;
32     };
33
34     //添加通知的一个监听事件
35     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noty:) name:@"myNoty" object:nil];
36
37 }
38
39 //实现代理方法
40 -(void)GWFMyDelegateBlockNotyView:(GWFMyDelegateBlockNotyView *)view andString:(NSString *)string andImage:(UIImage *)image {
41     self.myLabel.text = string;
42     self.myImageView.image = image;
43 }
44
45 //实现通知的监听方法
46 -(void)noty:(NSNotification *)noty {
47     self.myLabel.text = noty.userInfo[@"myText"];
48     self.myImageView.image = noty.userInfo[@"image"];
49 }
50
51 @end

执行结果:

1> 点击代理按钮后:

2> 点击通知按钮后:

3>点击block按钮后:

时间: 2024-10-24 17:25:53

回传值(代理、通知、block)的相关文章

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

iOS 页面间几种传值方式(属性,代理,block,单例,通知) 姜糖水 2015-05-03 52 阅读 iOS 移动开发 第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五

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

首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @property (nonatomic, strong) NSString *myName;//单例的属性,用于传值 +(DataSource*)sharedDataSource;//建立单例对象 @end .m文件 #import "DataSource.h" @implementati

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

有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳转传值 1.属性传值(正向传值) 属性传值是正向传值,只可以从前面一个页面传递到第二个页面,不可以从第二个页面传递到第一个页面 2.代理传值(逆向传值) 代理传值是逆向传值 代理传值步骤 代理传值 适用于 反向传值 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewControll

iOS 代理与block 逆向传值 学习

一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己处理一下了,之前也在网上看了一下关于如何选择代理.block 或者通知中心.个人感觉代理和通知中心都比较简单,block稍为有点复杂.代理大家都会用,所以当时就选用了通知中心来处理.之后有一次公司的网实在太差了,出现了逆传数据失败的情况,引起了我的注意,打上断点之后才发现,通知中心的那个方法完全没有

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

手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但其具有局限性(一般用于将第一个页面的值传递到第二个页面,但无法从第二个页面传到第一个页面), 向SecondViewController传值:SecondViewController 设置属性 sendMessage 1 - (void)rightButtonAction:(UIBarButtonI

Android Activity 回传值

记录一下Activity往上级回传值的一些心得,及疑问. 需求: Activity A -> Activity B,并把一个Object instance(p) 传给B,Activity B 中,p的一些数据会实时更新,当用户返回A 时,需要把p带回给A, 方法 1  startActivityForResult() A 中: Intent intent = new Intent(this, B.class); intent.putExtra("key",value); star

$? (命令回传值)

命令下达情况 说明 cmd1 && cmd2 1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2.2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行. cmd1 || cmd2 1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行.2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2. $? (命令回传值),布布扣,bubuko.com

Android 两个Activity间的传值与回传值

MainActivity.java Intent intent = new Intent(); intent.putExtra("message", "传到SecondActivity的值"); intent.setClass(MainActivity.this, SecondActivity.class); /*  * 如果希望启动另一个Activity,并且希望有返回值,则需要使用startActivityForResult这个方法,  * 第一个参数是Inte

iOS开发- 界面传值(1)-通知模式(广播)

之后的几篇博客, 记录下不同界面间传值的常用办法. 这篇文章记录广播的方式. iOS的设计模式中,通知模式也是其中重要的模式之一,Notification直译为通知,其实本人觉得叫做广播模式更为贴切.它的作用就是一个对象对多个对象的同步操作.用法很简单,一个对象发出一个广播,需要收听的听众就先注册一下,然后选定频道,完了就可以收听广播的内容了. 但是要注意一点, 在收听之前, 一定要先注册. 不然发送的广播接受不到, 也就是值改变了, 不会做出响应. 下面是一个简单的demo, 效果如下: 第一