iOS多控制器间Block传值

从自学iOS开发以来对ViewControllerControllerController之间的传值方法一直感兴趣。在网上也看过不少关于Blcok传值方法。本文想用去年我自己写的一个注册界面来加深在多个控制器间使用Block传值的理解。

演示.gif

需求简介

A控制器View是登录界面,点击NavigationBar 上的【注册】按钮,Push至B控制器【注册1/2】,输入用户名和密码后点击【下一步】按钮Push至C控制器【注册界面2/2】,在C界面上输入验证码完成注册后Pop至A控制器并将手机号传给A控制器显示在用户名输入框里。

能实现这个需求的方案有很多种,但是我就想使用Block,哪怕过程相对其他方案更繁琐,就想知道A和C之间隔着B控制器这样的情况下如何使用Block传值。之前在CocoaChina上也询问过这个问题,那时对Block的初始化与调用还是一知半解的。

iOS多控制器间Block传值_第1张图片
控制器间关系示意.png

项目截图

iOS多控制器间Block传值_第2张图片
项目截图.png

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 
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 
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

你可能感兴趣的:(iOS多控制器间Block传值)