block的高级用法(一) -- block传值
2016-09-18 15:19
106 查看
我们先从简单的入手,先讲下block的传值,后面会有更精彩的。
在讲传值之前我们先复习下block的基础知识:
当我加上一句代码:
前后对照着看很明显是block()这句才取到调用函数的目的。这让我们想起来了C语言中,我们通常在main函数外面来定义一个函数,然后在main函数内部调用:
我们发现block跟C语言的方式非常类似。不同点就是声明的方式不同:block可以在函数内部直接声明,紧接在block的后面,block就像函数的指针。不像C语言一样得单独的写成一块来声明函数。
好了,我们现在说下今天的重点:
首先,我定义了两个控制器FirstViewController和SecondViewController。
FirstViewController中有一个Label和一个按钮,点击按钮会跳转到SecondViewController中,如图所示:
SecondViewController中有一个textField的输入框,效果如图所示:
实现的效果是当我在SecondViewController中的textField中输入字符,返回FirstViewController后会在里面的label中显示出来。
具体实现思路如下:
1.在SecondViewController.h中定义一个block:
2.然后在返回FirstViewController的时候(为了方面此时我直接在- (void)viewWillDisappear:(BOOL)animated调用),实现block:
返回后的效果:
实现了上述效果。
对block不是很了解的同学可能会有些懵,所以我用通俗的话总结下block的基础知识:
1.在FirstViewController中我们只是写了block中的具体实现,block中的代码并不会立即执行。
2.在SecondViewController中我们通过block()来调用实现block内部代码的运行。
考虑到大家纯碎的看,估计不太好理解,我每次都会把源码拿出来,源码都在我的GitHub中,想要源码的点击这里。
在讲传值之前我们先复习下block的基础知识:
- (void)viewDidLoad { [super viewDidLoad]; void(^block)() = ^() { NSLog(@"我被调用了"); }; }此时我定义了一个无返回值,无参数的block,当我运行的时候,没有任何输出。
当我加上一句代码:
- (void)viewDidLoad { [super viewDidLoad]; void(^block)() = ^() { NSLog(@"我被调用了"); }; block(); }运行后,有了输出,输出如下:
前后对照着看很明显是block()这句才取到调用函数的目的。这让我们想起来了C语言中,我们通常在main函数外面来定义一个函数,然后在main函数内部调用:
#include <stdio.h> void test() { printf("我被调用了"); } int main(int argc, const char * argv[]) { test(); return 0; }main函数中调用了声明的test函数。
我们发现block跟C语言的方式非常类似。不同点就是声明的方式不同:block可以在函数内部直接声明,紧接在block的后面,block就像函数的指针。不像C语言一样得单独的写成一块来声明函数。
好了,我们现在说下今天的重点:
首先,我定义了两个控制器FirstViewController和SecondViewController。
FirstViewController中有一个Label和一个按钮,点击按钮会跳转到SecondViewController中,如图所示:
SecondViewController中有一个textField的输入框,效果如图所示:
实现的效果是当我在SecondViewController中的textField中输入字符,返回FirstViewController后会在里面的label中显示出来。
具体实现思路如下:
1.在SecondViewController.h中定义一个block:
#import <UIKit/UIKit.h> /** 定义一个block */ typedef void(^blockName)(NSString *text); @interface SecondViewController : UIViewController //block在ARC中使用strong,非ARC中使用copy @property (nonatomic, strong) blockName block; @end
2.然后在返回FirstViewController的时候(为了方面此时我直接在- (void)viewWillDisappear:(BOOL)animated调用),实现block:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //判断block是否为空 if (_block) { _block(self.textField.text); } }3.在FirstViewController中定义block的具体实现:
- (void)buttonClick { SecondViewController *second = [[SecondViewController alloc] init]; second.block = ^(NSString *text) { self.label.text = text; }; [self.navigationController pushViewController:second animated:YES]; }实现的效果:
返回后的效果:
实现了上述效果。
对block不是很了解的同学可能会有些懵,所以我用通俗的话总结下block的基础知识:
1.在FirstViewController中我们只是写了block中的具体实现,block中的代码并不会立即执行。
2.在SecondViewController中我们通过block()来调用实现block内部代码的运行。
考虑到大家纯碎的看,估计不太好理解,我每次都会把源码拿出来,源码都在我的GitHub中,想要源码的点击这里。
相关文章推荐
- Ruby中Block和迭代器的使用讲解
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- c#窗体传值用法实例详解
- C#简单实现子窗体向父窗体传值的方法
- Ruby中的block代码块学习教程
- ASP.NET页面间的传值的几种方法
- 关于C语言中参数的传值问题
- C# Winform窗口之间传值的多种方法浅析
- php下通过POST还是GET来传值
- JS中Iframe之间传值的方法
- JavaScript实现同一页面内两个表单互相传值的方法
- js传值后台中文出现乱码的解决方法
- asp.net 页面间传值方法小结
- json传值以及ajax接收详解
- ASP.NET页面传递值的方式介绍
- JSP页面间传值问题实例简析
- Servlet与JSP间的两种传值情况
- javascript中的变量是传值还是传址的?
- Javascript showModalDialog两个窗体之间传值