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

UINavigationController介绍:12-顺传数据(源VC->目标VC)

在使用导航控制器进行子控制器切换时,经常会涉及到控制器之间的数据传递,例如在微信App中,当我们从联系人列表中选中某个联系人后,就会打开与该联系人的对话界面,此时就涉及到把选中的联系人信息传递到新打开的对话控制器中。

概念定义

在导航控制器管理的子控制器之间传递数据的过程中,有如下几个概念需要首先明确下:

  • 源控制器:调用pushViewController:方法的控制器;

  • 目标控制器:调用pushViewController:方法后,展示出来的新控制器;

  • 顺传:源控制器向目标控制器传递数据;

  • 逆传:目标控制器向源控制器传递数据。

顺传

顺传数据的核心思路是在目标控制中,新增一个数据模型的属性,在执行pushViewController:方法之前,把源控制器中的数据传递给该属性。一般情况下包括如下两个步骤:

  1. 在目标控制器中(DestinationViewController.h)新增属性,用于接收数据;
  2. 在源控制器(SourceViewController.m)中,初始化目标控制器,给目标控制器的新增属性赋值,并跳转到目标控制器

示例代码

下方的示例代码中,实现了数据从源控制器向目标控制器顺传的过程。

  • 首先,在目标控制器中(DestinationViewController.h)新增属性dataText,用于接收源控制器传递的字符串对象
@interface DestinationViewController : UIViewController
@property (nonatomic,copy) NSString *dataText;
@end
  • 在源控制器(SourceViewController.m)中,初始化目标控制器DestinationViewController,给目标控制器的dataText属性赋值,并跳转到目标控制器
-(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";
    
    //控制器跳转
    [self.navigationController pushViewController:descVC animated:YES];
}
  • 在目标控制器中,打印传递过来的数据
-(void)viewDidAppear:(BOOL)animated{
    //打印源控制器传递过来的数据
    NSLog(@"源控制器传递的数据:%@",self.dataText);
}

思考:能否在viewDidLoad方法中打印传递过来的数据?

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