block的简单回调传值

原创 2015年11月19日 14:36:31

由于block的火热,让我这个菜鸟也不得不多了解一下block的基本用法,虽然我之前用的是protocal代理的方式在页面之间进行的传值。但是,block的火热让我不得不来写一个demo学习下,好了废话不多说。

我所理解的block的简单用法:

首先借用大家比较熟知的一张图来解释下一般的block的样子,以及各个参数的意义。


按照调用函数的方式调用块对象变量就可以了:
int result = myBlock(4); 

 result是 28

。。。。。。。。。

当然对上图我的理解是,block定义的一种方法,这个方法需要传入一个int类型的参数,返回值也是一个int类型的数值。而myBlock就是函数的名字,我们在c语言中调用一个函数的时候,就是myBlock(4);这样调用,而且用一个int类型的result来接收返回值。

正如c语言中的函数,如果你定义了一个函数,而没有去调用这个函数,那么这个函数就不会执行(虽然这里说的不是特别对,但是可以这样理解)。所以想让函数执行,那么我们需要在main函数中去调用我们定义的这个函数。


再看下边的例子:

  1. int global = 1000;  
  2. int main(int argc, const char * argv[])  
  3. {  
  4.     @autoreleasepool {  
  5.         void(^block)(void) = ^(void)  
  6.         {  
  7.             global++;  
  8.             NSLog(@"global:%d", global);  
  9.         };  
  10.         block();  
  11.         NSLog(@"global:%d", global);  
  12.     }  
  13.     return 0;  
  14. }  
其中global时定义的一个全局变量,而在block中去调用这个变量,并且改变它是可以的,结果都是1001;

而定一个如果是一个局部变量

  1. int local = 500;  
  2. void(^block)(void) = ^(void)  
  3. {  
  4.       local++;  
  5.     NSLog(@"local:%d", local);  
  6. };  
  7. block();  
  8. NSLog(@"local:%d", local);  
这样在block中是不可以访问到这个变量的,会报错:


那么,如果我门想访问这个变量,并且改变它只需要在定义的时候加一个修饰符__block,然后我们就可以访问并且改变它了。


说了这么多无非想引入我要说的block的回调传值:

在两个页面间,当一个页面A和一个页面B之间,如果我想的是a中有一个button,点击这个button进入b。但是在b中有一个按钮,只有我点击b的按钮时,并且b会传值给a中的button来显示。

由于block数据类型的语法会降低整个代码的阅读性,所以常使用typedef来定义block类型。

开始,我搞不懂在哪个里边定义block的回调函数,所以只能死记了。哪个页面要传值,哪个页面来定义这个block的回调函数。

首先,我知道页面a中button显示的东西是页面b点击按钮时传递过来的,所以按照我记住的就是由页面b来定义这个block回调函数。

所以代码如下:

#import <UIKit/UIKit.h>

typedef void (^clickButtonCallBack)(NSString *str);

@interface BlockTestViewController : UIViewController

@property (copy, nonatomic) clickButtonCallBack callBack;

@end

我在b页面定义一个回调函数,也就是callBack的setter函数。首先定义个block的函数typedef void (^clickButtonCallBack)(NSString *str);让它可以传递一个字符串类型的参数,没有返回值。然后为类定义个参数,其中clickButtonCallBack 作为一种类型来定义callBack变量。
一开始也不习惯这种写法,但是,只要牢记block的基本样子,还是可以对照着写出来这个回调函数的typedef void (^clickButtonCallBack)(NSString *str)
然后我们回到页面b的.m文件中,在点击事件中:

- (void)clickButton{

    static int num = 0;

    NSString *s = [NSString stringWithFormat:@"点击 %d",num];

    [self.navigationController popViewControllerAnimated:YES];

    if(self.callBack){

        self.callBack(s);

        num++;

    }

}

我做了简单的处理,定义个num来记录我点击的次数,其实传递的字符串就是s,也就是我点击的次数形成的字符串

页面b是由页面a push进来的,我们现在看页面a的.m中我做的处理,同样我在页面a中有一个按钮,点击按钮的事件是:

- (void)clickButton{

    __weak typeof(self) weakSelf = self;

    BlockTestViewController *blockTest = [[BlockTestViewController alloc] init];

    blockTest.callBack=^(NSString *str){

        [weakSelf.button setTitle:str forState:UIControlStateNormal];

    };

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

}

其中,BlockTestViewController 便是我说的页面b,

 blockTest.callBack=^(NSString *str){

        [weakSelf.button setTitle:str forState:UIControlStateNormal];

    };

这里就是我调用block的回调函数时触发的事件。str便是页面b传过来的参数

经验证传值成功。


下边是全部代码:

页面a中:

.h

#import <UIKit/UIKit.h>

@interface BlockNextViewController : UIViewController

@end

.m

#import "BlockNextViewController.h"

#import "BlockTestViewController.h"

@interface BlockNextViewController ()

@property (nonatomic, weak) UIButton *button;

@end

@implementation BlockNextViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    UIButton *testButton = [UIButton buttonWithType:UIButtonTypeCustom];

    testButton.frame = CGRectMake(100, 400, 100, 40);

    [testButton setTitle:@"click" forState:UIControlStateNormal];

    [testButton addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside];

    _button = testButton;

    testButton.backgroundColor = [UIColor redColor];

    [self.view addSubview:testButton];

    // Do any additional setup after loading the view.

}


- (void)clickButton{

   __weak typeof(self) weakSelf = self;

   BlockTestViewController *blockTest = [[BlockTestViewController alloc] init];

    blockTest.callBack=^(NSString *str){

        [weakSelf.button setTitle:str forState:UIControlStateNormal];

    };

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

}


页面b中:

.h

#import <UIKit/UIKit.h>

typedef void (^clickButtonCallBack)(NSString *str);

@interface BlockTestViewController : UIViewController

@property (copy, nonatomic) clickButtonCallBack callBack;

@end


.m

#import "BlockTestViewController.h"

@interface BlockTestViewController ()

@property (nonatomic, weak) UIButton *testButton;

@end

@implementation BlockTestViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    UIButton *testButton = [UIButton buttonWithType:UIButtonTypeCustom];

    testButton.frame = CGRectMake(100, 400, 100, 40);

    [testButton setTitle:@"click" forState:UIControlStateNormal];

    [testButton addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside];

    testButton.backgroundColor = [UIColor redColor];

    _testButton = testButton;

    [self.view addSubview:testButton];

    // Do any additional setup after loading the view.

}

- (void)clickButton{

   static int num = 0;

     NSString *s = [NSString stringWithFormat:@"点击 %d",num];

    [self.navigationController popViewControllerAnimated:YES];

    if(self.callBack){

        self.callBack(s);

        num++;

    }

}






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS Block的基本使用以及Block传值

block为我们提供了一个非常便捷的方法去实现各种传值以及回调 合理的使用block可以减少代码量以及更加优雅的实现功能 现做个小整理如下: #pragma mark About Block ...

[iOS Block] 视图A.B之间的回调实例

背景介绍 有两个视图控制器 A B B作为A的subViewController 要求 在B上处理点击事件 , 改变A上的元素属性值 一般处理的方法有代理/ 通知 / Block 这里...

ios block回调的理解和总结

1. block回调与其他2种回调方式的区别   1) IOS常用回调方式有3种,如:delegate、NSNotificationCenter和block。   2) 通知:     (一对多)在...

iOS非常重要的 block回调

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

【iOS】利用block实现回调的示例

利用block完成回调,小demo一个。闲话少说,直接看代码吧!O(∩_∩)O哈哈~ TestObject.h #import typedef void (^FinishBlock)(NSS...

Maven项目部署到tomcat的几种方式

1.打war包到tomcat/webapps目录 这种方式其实跟非maven项目没什么区别,就是打包的方式不同 之后在target目录下会生成war包,复制到tomcat/webapps目...

maven(一):是否有必要使用maven

以下是普通项目和maven项目 分别引入spring core模块的区别 1,假设我们有十个项目,都需要引入spring core模块,那么需要十份重复的Spring core.jar和...

iOS block在不同界面的回调传值

iOS block在不同界面的回调传值

iOS block 回调传值

1.简单介绍一下用法在俩个Controller中使用blockMyRootViewController和PersonalCenterController 俩个VC控制器 动作是从MyRootView...

Block--两个界面 间回调传值

使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButt...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:block的简单回调传值
举报原因:
原因补充:

(最多只允许输入30个字)