在项目开发中,控制器之间传值是必不可少得。下面介绍一下block传值,分享经验或作笔记以备后用。
首先定义控制器 AViewController 和 BViewController,现在的状态假设为:
控制器 AViewController 模态推出 BViewController。
在 AViewController 中有(UILabel *)label
用来显示 BViewController 中 (UITextField *)textField 中的输入的字符串。
很容易发现,此时,将要由 B 向 A 传值。此时可以用代理传值,但是block传值代码量更少更方便。
现在我们需要在 BViewController 中声明 block 属性
//
// BViewController.h
//
#import <UIKit/UIKit.h>
typedef void(^ReturnValue)(NSString *);
@interface BViewController : UIViewController
@property (nonatomic,strong) ReturnValue returnValue;
//注:我用的ARC,所以属性用了strong,如果为MRC请改为并必须使用copy。
@end
现在需要在 AViewController 中创建这个 BViewController 的地方实现这个block函数:
//
// AViewController.m
//
#import "AViewController"
#import "BViewController"
@interface AViewController ()
@property (nonatomic,strong) UILabel *label;
//延展部分声明了 label 属性
@end
- (void)推出BViewController的方法:(){
BViewController *BVC = [BViewController new];
//这里当调用这个block时就会执行里面的语句,得到参数赋值给label
BVC.returnValue = ^(NSString *gottenText)
{
self.label.text = gottenText;
}
//自动选一个方式推出BVC,由于没有导航控制器,所以为模态。
[self showDetailViewController:BVC sender:nil];
}
实现了block函数,我们就需要调用了。现在在 BViewController 中,回到 AViewController 之前调用block。
//
// BViewController.m
//
#import "BViewController"
@interface BViewController ()
@property (nonatomic,strong) UITextField *textField;
//延展部分声明了textField属性
@end
- (void)回到AViewController的方法:{
// 调用block,参数为self.textField.text
self.returnValue(self.textField.text);
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
这样从 B 控制器向 A 控制器就轻松完成了。