iOS详细解析视图控制器的正向和逆向传值

本文主要介绍在不同的视图控制器之间进行传值,分为两种传值方式,正向传值比较容易,逆向传值相对于正向来说麻烦一点,需要使用代理或者是block

一、正向传值
正向传值只需要在第一个视图控制器中“拿到”第二个视图控制器,然后在跳转之前将第一个视图控制器的值赋值给第二个视图控制器所需要获得这个值的属性。跳转的方式有很多种,如果需要可以看另外一篇文章,这里就直接用 presentViewController 来示范:
说明:下面的代码是关联着storyboard

在ViewController.m文件中
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField1;
@property (weak, nonatomic) IBOutlet UITextField *textField2;
@end

这是跳转button的事件方法
- (IBAction)presentViewController:(id)sender
{
    // 在storyboard中设置secondViewController的identifier为123
    SecondViewController *secondVc = [self.storyboard instantiateViewControllerWithIdentifier:@"123"];
    // 关于传值的代码
    secondVc.data1 = self.textField1.text;
    secondVc.data2 = self.textField2.text;
    // 注意在这里不能够直接给第二个视图控制器的lable赋值,例如下面的代码就是不正确的
#if 0
    secondVc.lable1.text = self.textField1.text;
    secondVc.lable2.text = self.textField2.text;
#endif
    // 进行跳转
    [self presentViewController:secondVc animated:YES completion:nil];
}

在SecondViewController.h文件中
@property (nonatomic, strong) NSString *data1;
@property (nonatomic, strong) NSString *data2;
@property (weak, nonatomic) IBOutlet UILabel *lable1;
@property (weak, nonatomic) IBOutlet UILabel *lable2;

这是跳转的button的事件方法
- (IBAction)presentToSecondVIewController:(id)sender
{
    SecondViewController *secondVc = [self.storyboard instantiateViewControllerWithIdentifier:@"123"];
    // 将自己设置为第二个视图控制器的代理对象
    secondVc.delegate = self;
    [self presentViewController:secondVc animated:YES completion:nil];
}

在SecondViewController.m文件中
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    self.lable1.text = self.data1;
    self.lable2.text = self.data2;
}

二、逆向传值
关于逆向传值,介绍两种最常见的方法,一种是代理/协议,一种是block,对于这两种方法的介绍利用实际的代码进行详细说明
1、代理/协议
说明:下面代码也是依赖于storyboard的

在ViewController.m文件中(需要去声明代理)
@property (weak, nonatomic) IBOutlet UILabel *lable;

这是跳转button的事件方法
- (IBAction)presentToSecondVIewController:(id)sender
{
    // 在storyboard中将第二个视图控制器的identifier设置为了123
    SecondViewController *secondVc = [self.storyboard instantiateViewControllerWithIdentifier:@"123"];
    // 将自己设置为第二个视图控制器的代理对象
    secondVc.delegate = self;
    [self presentViewController:secondVc animated:YES completion:nil];
}

#pragma mark - 第二个视图控制器的代理方法
- (void)passValue:(NSString *)lableText
{
    self.lable.text = lableText;
}

在SecondViewController.h中
// 1、声明协议
@protocol SecondViewControllerDelegate 
@optional
// 2、协议的方法
- (void)passValue :(NSString *)lableText;
@end

@interface SecondViewController : ViewController
// 3、定义协议属性
@property (nonatomic,weak)id delegate;

在SecondViewController.m中

- (IBAction)dissmissBackToVIewController:(id)sender
{
    // 判断这个协议方法是否被实现
    if ([self.delegate respondsToSelector:@selector(passValue:)]) {
        // 如果实现了就将第二个视图控制器中lable的值给传到代理方法中,使得第一个类在实现代理方法的时候可以能够或者这个值(这个值在实现代理方法的时候就是方法的参数lableText)
        [self.delegate passValue:self.lable.text];
    }
    // 跳转会第一个视图控制器
    [self dismissViewControllerAnimated:YES completion:nil];
}

2、block
说明:下面的代码是依赖于storyboard的

在ViewController.m中
这是跳转button的事件方法
@property (weak, nonatomic) IBOutlet UILabel *lable;

- (IBAction)tureToSecondVc:(id)sender
{
    // 在storyboard里面设置第二个视图控制器的identifier为123
    SecondViewController *secondVc = [self.storyboard instantiateViewControllerWithIdentifier:@"123"];
    // 实现block
    secondVc.backValue = ^(NSString *tel)
    {
        self.lable.text = tel;
    };
    [self presentViewController:secondVc animated:YES completion:nil];
}

在SecondViewController.h中
@property (weak, nonatomic) IBOutlet UILabel *lable;

// 声明一个block(block的定义使用copy)
@property (copy , nonatomic) void(^backValue)(NSString *lableText);

在SecondViewController.m中
这是返回button的事件方法
- (IBAction)dissmissBackToViewController:(id)sender
{
    // 当返回的时候,在block中传值
    self.backValue(self.lable.text);
    [self dismissViewControllerAnimated:YES completion:nil];
}





你可能感兴趣的:(传值问题,iOS)