在iOS开发过程中,我们经常会涉及两个界面的传值,从中我们也总结了很多常用的传值的方法:
例如:从前一界面向后一界面传值(从前向后传值) 时,通常使用 “属性传值”;
从后一界面向前一界面传值(从后向前传值)时,通常使用“代理方法传值”
另外还有两种场景都适用的 “单例传值”等。
除了以上的几种传值方式外,在iOS的开发中我们还会经常使用的一种传值方法就是 “Block传值”
下面介绍Block在两个界面之间的传值:
先简述一下整体的思想:
首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButton,其中UILabel是为了显示第二个视图控制器传过来的字符串,UIButton是为了push到第二个界面。
第二个界面的只有一个UITextField,是为了输入文字,当输入文字,并且返回第一个界面的时候,当第二个视图将要消失的时候,就将第二个界面上TextFiled中的文字传给第一个界面,并且显示在UILabel上。
其实核心代码就几行代码:
下面是主要代码:(由于本人是用storyBoard创建的工程,所以上面的属性和相应的方法,是使用系统生成的outlet)
一、在第二个视图控制器的.h文件中定义声明Block属性
<span style="font-size:18px;"><strong>typedef void (^ReturnTextBlock)(NSString *showText);
@interface TextFieldViewController : UIViewController
@property (nonatomic, copy) ReturnTextBlock returnTextBlock;
- (void)returnText:(ReturnTextBlock)block;
@end</strong></span>
其中 typedef 是为要声明的Block重新定义了一个新的名称,原因是在后续的代码中使用定义的block更加方便,叫做
<span style="font-size:18px;"><strong>ReturnTextBlock</strong></span>
第三行 @property 是为当前的类定义的一个Block属性
第四行 是一个在第一个界面传进来一个Block语句块的函数,不用也可以,不过加上会减少代码的书写量
二、实现第二个视图控制器的方法
- (void)returnText:(ReturnTextBlock)block {
self.returnTextBlock = block;
}
- (void)viewWillDisappear:(BOOL)animated {
if (self.returnTextBlock != nil) {
self.returnTextBlock(self.inputTF.text);
}
}
其中inputTF是视图中的UITextField。
第一个方法就是定义的那个方法,把传进来的Block语句块保存到本类的实例变量returnTextBlock(.h中定义的属性)中,然后寻找一个时机调用,而这个时机就是上面说到的,当视图将要消失的时候,需要重写:
- (void)viewWillDisappear:(BOOL)animated ;
三、在第一个视图中获得第二个视图控制器,并且用第二个视图控制器来调用定义的属性
如下方法中书写:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
TextFieldViewController *tfVC = segue.destinationViewController;
[tfVC returnText:^(NSString *showText) {
self.showLabel.text = showText;
}];
}
可以看到代码中的注释,系统告诉我们可以用[segue destinationViewController]来获得新的视图控制器,也就是我们说的第二个视图控制器。
这时候上面(第一步中)定义的那个方法起作用了,如果你写一个[tfVC returnText按回车 ,系统会自动提示出来一个:
tfVC returnText:<#^(NSString *showText)block#>
的东西,我们只要在焦点上回车,就可以快速创建一个代码块了,大家可以试试。这在写代码的时候是非常方便的。
Block传值Demo的源码下载地址为:http://pan.baidu.com/s/1mgoO39m
附:该网盘会不定时分享iOS开发相关Demo及Mac电脑常用的软件与维护方法等,有意者可以添加关注