从自学iOS开发以来对View
与Controller
、Controller
与Controller
之间的传值方法一直感兴趣。在网上也看过不少关于Blcok
传值方法。本文想用去年我自己写的一个注册界面来加深在多个控制器间使用Block
传值的理解。
需求简介
A控制器View
是登录界面,点击NavigationBar
上的【注册】按钮,Push至B控制器【注册1/2】,输入用户名和密码后点击【下一步】按钮Push至C控制器【注册界面2/2】,在C界面上输入验证码完成注册后Pop至A控制器并将手机号传给A控制器显示在用户名输入框里。
能实现这个需求的方案有很多种,但是我就想使用Block
,哪怕过程相对其他方案更繁琐,就想知道A和C之间隔着B控制器这样的情况下如何使用Block
传值。之前在CocoaChina上也询问过这个问题,那时对Block
的初始化与调用还是一知半解的。
项目截图
A控制器.m文件里实现Push至B控制器的方法
- (IBAction)pushToB:(UIButton *)sender {
SecondViewController *secondVC=[[SecondViewController alloc]init];
__weak typeof(self) weakSelf=self;
secondVC.secondBlock = ^(NSString *string) {
weakSelf.userTextField.text=string;
};
[self.navigationController pushViewController:secondVC animated:YES];
}
B控制器.h文件声明Block
#import <UIKit/UIKit.h>
typedef void(^SecondControllerBlock)(NSString *string);
@interface SecondViewController : UIViewController
@property(nonatomic,copy)SecondControllerBlock secondBlock;
@end
B控制器.m文件里实现Push至C控制器的方法
- (IBAction)pushToC:(UIButton *)sender {
ThirdViewController *thirdVC=[[ThirdViewController alloc]init];
__weak typeof(self) weakSelf=self;
thirdVC.thirdBlock = ^(NSString *str) {
if (weakSelf.secondBlock) {
weakSelf.secondBlock(str);
}
};
[self.navigationController pushViewController:thirdVC animated:YES];
}
C控制器.h文件声明Block
#import <UIKit/UIKit.h>
typedef void(^ThirdControllerBlock)(NSString *str);
@interface ThirdViewController : UIViewController
@property(nonatomic,copy)ThirdControllerBlock thirdBlock;
@end
C控制器.m文件里实现Pop至根控制器的方法
- (IBAction)popToA:(UIButton *)sender {
if (self.thirdBlock) {
self.thirdBlock(self.inputTextField.text);//调用block
}
[self.navigationController popToRootViewControllerAnimated:YES];
}
应该说此处使用Userdefaults
也能完成且更实现起来更简单,但是此处就是为了用Block
而用Block
。当时短路的地方是在A控制器初始化了Block,在C控制器里进行了调用。明知道A先得Push至B,然后B再Push到C,脑子绕不过弯来,一直不知道B控制器里也需要定义一个Block
。