使用Block实现界面反向传值
2016-07-19 本文已影响704人
J_Knight_
需求点
本文介绍如何通过设置block来实现从第二个页面返回到第一个页面时,将第二个页面的数据传给第一个页面。
通过代理设计模式也可以实现该功能,但是笔者个人感觉过程代理模式的设置比较繁琐,还是通过Block来实现更加方便一点。而且block也是iOS进阶的必经之路,多了解还是有好处的。
实现步骤
- 在传值类(第二页)添加block属性。
- 在接值类(第一页)设置传值类block代码。
- 特定时刻在传值类(第二页)向block传入需要传递的值。
代码实现:
第一步:在第二个页面定义block作为传值block的属性
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
//Block传值Step 1: 定义block为传值block的属性
@property (nonatomic, copy)void(^sendValueBlock)(NSString *valueString);
@end
第二步:在从第一个跳转到第二个页面的前一刻,设置第二个页面的block,在block内部写下待执行的操作(将传递过来的值显示在第一个页面)
/**
* 在第一个页面点击按钮后,初始化block并跳转到第二个页面
*
* @param button 第一个页面的按钮
*/
- (void)goToNextPage:(UIButton *)button
{
//Block传值Step 2: 接收值的类取到传递值的类的指针,并设置block
//因为在block内,firstVC的属性可被更改,所以应该设定其关键字为__weak
__weak ViewController *firstVC = self;
SecondViewController *secondVC = [[SecondViewController alloc] init];
[secondVC setSendValueBlock:^(NSString *string) {
firstVC.label.text = string;
}];
[self.navigationController pushViewController:secondVC animated:YES];
}
第三步:在从第二个页面返回到第一个页面前一刻,将数据传入block
/**
* 在第二个页面点击按钮后,给block属性传值并回到第一个页面
*
* @param button 第二个页面的按钮
*/
- (void)goToFrontPage:(UIButton *)button
{
//Block传值Step 3: 传值类将要传的值传入自己的block里
self.sendValueBlock(self.textField.text);
[self.navigationController popViewControllerAnimated:YES];
}
效果图:
传值过程:由左至右
流程如下:
- 在第一页点击“下一页”进入第二页。
- 在第二页输入要传的信息(“给第一页的值”),并点击“保存并传给上一页按钮”回到第一页。
- 在第一页显示传来的信息(“给第一页的值”)。
Demo可以有~
如果有小伙伴想要Demo请留下邮箱哈~