免费开源的iOS开发学习平台

UINavigationController介绍:15-使用Block逆传数据(目标VC->源VC)

被导航控制器管理的子控制器之间进行数据逆向传递,除了使用代理之外,还可以使用通知(NSNotification)以及Block。本节介绍一下如何使用Block。

使用Block实现数据逆传的步骤

下方的示例代码,实现了使用Block的方式从目标控制器向源控制器传递数据的过程。

  • 在目标控制器DestinationViewController.h中,添加Block属性
@interface DestinationViewController : UIViewController
//声明一个名为PassDataBlock的block,无返回值,有一个NSString类型的参数
typedef void (^PassDataBlock)(NSString * dataText);
//添加PassDataBlock类型的block属性
@property (copy) PassDataBlock block;
@end

  • 在目标控制器DestinationViewController.h中,设置block中代码的执行时机,即在返回上一个控制器之前调用
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //执行Block中的代码
    if(self.block){
        self.block(@"九九学院");
    }
    //返回上一个控制器
    [self.navigationController popViewControllerAnimated:YES];
}
  • 在源控制器SourceViewController.h中,给目标控制器对象的block赋值,即调用block时需要执行的操作
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    DestinationViewController *descVC = [[DestinationViewController alloc] init];
    descVC.view.backgroundColor = [UIColor redColor];
    descVC.navigationItem.title = @"目标控制器";
    //跳转前传递数据
    descVC.dataText = @"99iOS.com";
    
    //设置Block
    descVC.block = ^(NSString * string){
        NSLog(@"目标控制器回传的字符串数据(使用Block):%@",string);
    };
    
    //控制器跳转
    [self.navigationController pushViewController:descVC animated:YES];
}

运行结果如下。

示例代码

https://github.com/99ios/9.2.15