iOS 页面传值知多少?你真的了解吗?

简介: iOS开发中,页面传值是很常见的,但是页面传值你究竟知道多少呢?笔者这篇文章就是给大家介绍一下页面传值的具体方式,有不足之处,欢迎大家指正,希望能和大家共同进步。说明一下:这里所说的正向、反向传值是指相关联的两个页面间的传值。

iOS开发中,页面传值是很常见的,但是页面传值你究竟知道多少呢?笔者这篇文章就是给大家介绍一下页面传值的具体方式,有不足之处,欢迎大家指正,希望能和大家共同进步。说明一下:这里所说的正向、反向传值是指相关联的两个页面间的传值。


目前我所了解和掌握的传值方式有:属性传值、代理传值、Block传值、KVO传值、通知传值、单例传值、KVC传值。


下面我们来一一看下它们究竟是怎样进行操作和传值的呢?


假设我们现在有控制器(页面)A和控制器(页面)B,A->push->B,即A是B的上一个页面(控制器)。


  1. 属性传值


用法:正向传值
需求:当A-push到B时,B中有一个Label需要显示从A中的一个TextField输入的内容,这时我们需要用到正向传值。
A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 @interface A_ViewController ()
 @property (nonatomic, strong) UITextField *aTextField;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.aTextField.layer.borderWidth = 1;
     [self.view addSubview:self.aTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)buttonAction:(UIButton *)sender {
     /**
      什么时候可以用 属性 传值
      A 传到 B,正向传值
      B 在 A页面 提前初始化
      **/
     B_ViewController *bViewController = [[B_ViewController alloc] init];
     bViewController.string = self.aTextField.text;
     [self.navigationController pushViewController:bViewController animated:YES];
 }
 @end


  1. B控制器.h文件:


#import <UIKit/UIKit.h>
 @interface B_ViewController : UIViewController
 @property (nonatomic, copy) NSString *string;
 @end


  1. B控制器.m文件:


#import "B_ViewController.h"
 @interface B_ViewController ()
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     self.view.backgroundColor = [UIColor whiteColor];
     UILabel *bLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     bLabel.layer.borderColor = [UIColor grayColor].CGColor;
     bLabel.layer.borderWidth = 1;
     [self.view addSubview:bLabel];
     bLabel.text = self.string;
 }
 @end


  1. 代理传值
    用法:反向传值:
    需求:A-push到B,当B消失的时候,A中有一个Label需要显示从B中的一个TextField输入的内容,这时我们需要用到反向传值。
    A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 @interface A_ViewController () <BToADelegate>
 @property (nonatomic, strong) UILabel *aLabel;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aLabel.layer.borderColor = [UIColor grayColor].CGColor;
     self.aLabel.layer.borderWidth = 1;
     [self.view addSubview:self.aLabel];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"push到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 -(void)buttonAction:(UIButton *)sender {
     B_ViewController *bViewController = [[B_ViewController alloc] init];
     //设置代理
     bViewController.delegate = self;
     [self.navigationController pushViewController:bViewController animated:YES];
 }
 /**
  什么时候可以用 代理 传值
  B 传到 A,反向传值
  B 在 A页面 初始化
  设置A为B的代理
  执行代理方法
  **/
 - (void)transferString:(NSString *)string {
     self.aLabel.text = string;
 }
 @end


  1. B控制器.h文件:


#import <UIKit/UIKit.h>
 // 声明代理
 @protocol BToADelegate <NSObject>
 // 代理方法
 - (void)transferString:(NSString *)string;
 @end
 @interface B_ViewController : UIViewController
 // 代理属性
 @property (nonatomic, weak) id<BToADelegate> delegate;
 @end
  1. B控制器.m文件:
#import "B_ViewController.h"
 @interface B_ViewController ()
 @property (nonatomic, strong) UITextField *bTextField;;
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     self.view.backgroundColor = [UIColor whiteColor];
     self.bTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.bTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.bTextField.layer.borderWidth = 1;
     [self.view addSubview:self.bTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传值A" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)buttonAction:(UIButton *)sender {
     // 判断有没有代理以及代理是否响应代理方法
     if (self.delegate && [self.delegate respondsToSelector:@selector(transferString:)]) {
         [self.delegate transferString:self.bTextField.text];
     }
     [self.navigationController popToRootViewControllerAnimated:YES];
 }
 @end


  1. Block传值


用法:反向传值:
需求:A-push到B,当B消失的时候,A中有一个Label需要显示从B中的一个TextField输入的内容,这时我们需要用到反向传值。
A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 @interface A_ViewController ()
 @property (nonatomic ,strong) UILabel *aLabel;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aLabel.layer.borderColor = [UIColor grayColor].CGColor;
     self.aLabel.layer.borderWidth = 1;
     [self.view addSubview:self.aLabel];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"push到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)buttonAction:(UIButton *)sender {
     B_ViewController *bViewController = [[B_ViewController alloc] init];
     __weak __typeof(self) weakSelf = self;
     // block 回调接收
     [bViewController setBlock:^(NSString *string){
         weakSelf.aLabel.text = string;
     }];
     [self.navigationController pushViewController:bViewController animated:YES];
 }


  1. B控制器.h文件:


#import <UIKit/UIKit.h>
 // 定义一个block
 typedef void(^BToAblock)(NSString *string);
 @interface B_ViewController : UIViewController
 // block 属性
 @property (nonatomic, copy)BToAblock block;
 @end


  1. B控制器.m文件:


#import "B_ViewController.h"
 @interface B_ViewController ()
 @property (nonatomic, strong) UITextField *bTextField;
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     self.view.backgroundColor = [UIColor whiteColor];
     self.bTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.bTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.bTextField.layer.borderWidth = 1;
     [self.view addSubview:self.bTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传值A" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)buttonAction:(UIButton *)sender {
     /**
      Blcok 传值
      反向传值
      B 传到 A
      */
     _block(self.bTextField.text);
     [self.navigationController popToRootViewControllerAnimated:YES];
 }
 @end


  1. KVO传值

用法:反向传值:
需求:A-push到B,当B消失的时候,A中有一个Label需要显示从B中的一个TextField输入的内容,这时我们需要用到反向传值。
A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 @interface A_ViewController ()
 @property (nonatomic, strong) UILabel *aLabel;
 @property (nonatomic, strong) B_ViewController *bViewController;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aLabel.layer.borderColor = [UIColor grayColor].CGColor;
     self.aLabel.layer.borderWidth = 1;
     [self.view addSubview:self.aLabel];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"push到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
     /**
      KVO 创建 三步一定要写
         1. 注册观察者
         2. KVO的回调
         3. 移除观察者
      */
     // B 传到 A ,反向传值
     //注册观察者,注意:观察者的注册和移除要对应,如果移除时发现没有注册观察者,程序会crash
      self.bViewController = [[B_ViewController alloc] init];
     [self.bViewController addObserver:self forKeyPath:@"string" options:NSKeyValueObservingOptionNew context:nil];
 }
 - (void)buttonAction:(UIButton *)sender {
     [self.navigationController pushViewController:self.bViewController animated:YES];
 }
 // KVO的回调
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
     if ([keyPath isEqualToString:@"string"]) {
         self.aLabel.text = self.bViewController.string;
     }
 }
 // KVO 的移除方式  (和通知一样要移除)
 - (void)dealloc {
     [self.bViewController removeObserver:self forKeyPath:@"string"];
 }
 @end


  1. B控制器.h文件:


#import <UIKit/UIKit.h>
 @interface B_ViewController : UIViewController
 @property (nonatomic, copy) NSString *string;
 @end


  1. B控制器.m文件:


#import "B_ViewController.h"
 @interface B_ViewController ()
 @property (nonatomic, strong) UITextField *bTextField;
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     self.view.backgroundColor = [UIColor whiteColor];
     self.bTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.bTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.bTextField.layer.borderWidth = 1;
     [self.view addSubview:self.bTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传值A" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)buttonAction:(UIButton *)sender {
     // KVO
     // 把self.bTextfield.text 赋值给当前属性
     // 在A中 监听 当前属性
     self.string = self.bTextField.text;
     [self.navigationController popToRootViewControllerAnimated:YES];
 }
 @end


  1. 通知传值
    用法:正向传值
    需求:当A-push到B时,B中有一个Label需要显示从A中的一个TextField输入的内容,这时我们需要用到正向传值。
    用法:反向传值:
    需求:A-push到B,当B消失的时候,A中有一个Label需要显示从B中的一个TextField输入的内容,这时我们需要用到反向传值。
    我们在此将两种传值情况写到一个Demo中,所以将上述Label换为Textfield即可,如下:
    A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 @interface A_ViewController ()
 @property (nonatomic, strong) UITextField *aTextField;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.aTextField.layer.borderWidth = 1;
     [self.view addSubview:self.aTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
     // 接收通知
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tzAction:) name:@"B2A" object:nil];
 }
 - (void)buttonAction:(UIButton *)sender {
     // 通知传值 一般是用于回传
     // 现在是 A传到B,正向传值
     // 发送通知的方法 要写在执行方法里面
     B_ViewController *bViewController = [[B_ViewController alloc] init];
     [[NSNotificationCenter defaultCenter] postNotificationName:@"A2B" object:nil userInfo:@{@"key":self.aTextField.text}];
     [self.navigationController pushViewController:bViewController animated:YES];
 }
 // 回调通知
 - (void)tzAction:(NSNotification *)sender {
     self.aTextField.text = sender.userInfo[@"key"];
 }
 // 移除通知
 - (void)dealloc {
     [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
 @end


  1. B控制器.m文件:


#import "B_ViewController.h"
 @interface B_ViewController ()
 @property (nonatomic, strong) UITextField *bTextField;
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传值A" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 //如果是从A传到B的话,B.m里要创建一个init方法,在里面写监听并在里面创建接收容器才能成功(因为程序先执行init方法再到viewDidLoad方法,当传值过去时在init就开始监听,如果这里没有创建textField接收,那就传不过去了,所以要在init里同时创建接收器(生命周期的问题));
 -(instancetype)init
 {
     if (self = [super init]) {
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tzAction:) name:@"A2B" object:nil];
         self.bTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
         self.bTextField.layer.borderColor = [UIColor grayColor].CGColor;
         self.bTextField.layer.borderWidth = 1;
         [self.view addSubview:self.bTextField];
     }
     return self;
 }
 //接收通知
 - (void)tzAction:(NSNotification *)sender {
     self.bTextField.text = sender.userInfo[@"key"];
 }
 // 移除通知
 - (void)dealloc  {
     // 移除所有
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     // 移除某个
     // [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tz" object:nil];
 }
 //发送通知
 - (void)buttonAction:(UIButton *)sender {
     // B传到A,反向传值
     [[NSNotificationCenter defaultCenter] postNotificationName:@"B2A" object:nil userInfo:@{@"key":self.bTextField.text}];
     [self.navigationController popToRootViewControllerAnimated:YES];
 }
 @end


  1. 单例传值


用法:正向传值
需求:当A-push到B时,B中有一个Label需要显示从A中的一个TextField输入的内容,这时我们需要用到正向传值。
用法:反向传值:
需求:A-push到B,当B消失的时候,A中有一个Label需要显示从B中的一个TextField输入的内容,这时我们需要用到反向传值。
我们在此将两种传值情况写到一个Demo中,所以将上述Label换为Textfield即可,如下:
A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 #import "DanLi.h"
 @interface A_ViewController ()
 @property (nonatomic, strong) UITextField *aTextField;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.aTextField.layer.borderWidth = 1;
     [self.view addSubview:self.aTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)viewWillAppear:(BOOL)animated
 {
     // 单例 传值 B传到A (可以双向传值)
     DanLi *danli = [[DanLi alloc] init];
     self.aTextField.text = danli.value;
 }
 - (void)buttonAction:(UIButton *)sender {
     // 单例 传值 A传到B (可以双向传值)
     DanLi *danli = [DanLi sharedDanLi];
     danli.value = self.aTextField.text;
     B_ViewController *bViewController = [[B_ViewController alloc] init];
     [self.navigationController pushViewController:bViewController animated:YES];
 }


  1. B控制器.m文件:


#import "B_ViewController.h"
 #import "DanLi.h"
 @interface B_ViewController ()
 @property (nonatomic, strong) UITextField *bTextField;
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     self.view.backgroundColor = [UIColor whiteColor];
     self.bTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.bTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.bTextField.layer.borderWidth = 1;
     [self.view addSubview:self.bTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传值A" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
     self.bTextField.text = [DanLi sharedDanLi].value;
 }
 - (void)buttonAction:(UIButton *)sender {
     //B传给A
     [DanLi sharedDanLi].value = self.bTextField.text;
     [self.navigationController popToRootViewControllerAnimated:YES];
 }
 @end


  1. 单例类.h文件:


#import <Foundation/Foundation.h>
 @interface DanLi : NSObject
 //创建一个单例//如果在单线程里可以用nonatomic,如果在多线程里一定要用atomic,保证是只有一个在调用,不然在多线程里面如果多个方法调用修改单例类里的属性时会冲突
 @property (atomic, copy) NSString *value;
 + (DanLi *)sharedDanLi;
 @end


  1. 单例类.m文件:


#import "DanLi.h"
 static DanLi *danli = nil;
 @implementation DanLi
 //实现方法,判断是否为空,是就创建一个全局实例给它
 + (DanLi *)sharedDanLi {
     if (danli == nil) {
         danli = [[DanLi alloc] init];
     }
     return danli;
 }
 //避免alloc/new创建新的实例变量--->增加一个互斥锁
 + (id)allocWithZone:(struct _NSZone *)zone {
     @synchronized(self) {
         if (danli == nil) {
             danli = [super allocWithZone:zone];
         }
     }
     return danli;
 }
 //避免copy,需要实现NSCopying协议
 - (id)copyWithZone:(NSZone *)zone {
     return self;
 }
 @end


  1. KVC传值
    用法:正向传值
    需求:当A-push到B时,B中有一个Label需要显示从A中的一个TextField输入的内容,这时我们需要用到正向传值。
    A控制器.m文件:


#import "A_ViewController.h"
 #import "B_ViewController.h"
 @interface A_ViewController ()
 @property (nonatomic, strong) UITextField *aTextField;
 @end
 @implementation A_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     self.title = @"A";
     self.view.backgroundColor = [UIColor whiteColor];
     self.aTextField = [[UITextField alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     self.aTextField.layer.borderColor = [UIColor grayColor].CGColor;
     self.aTextField.layer.borderWidth = 1;
     [self.view addSubview:self.aTextField];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传到B" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
 }
 - (void)buttonAction:(UIButton *)sender {
     B_ViewController *bViewController = [[B_ViewController alloc] init];
     /**
         KVC 传值:这里只能传A传到B (因为 B在A页面提前初始化)
         B 有个属性 string
         用B对象 给B属性赋值(回顾下OC中KVC赋值 就理解了)
         这里forkey 一定要和B 属性名字一致 (也可以用@"_string")因为是属性
      */
     // 给B属性string  赋值
     [bViewController setValue:self.aTextField.text forKey:@"string"];
     [self.navigationController pushViewController:bViewController animated:YES];
 }
 @end


  1. B控制器.h文件:


#import <UIKit/UIKit.h>
 @interface B_ViewController : UIViewController
 @property (nonatomic, copy) NSString *string;
 @end


  1. B控制器.m文件:


#import "B_ViewController.h"
 @interface B_ViewController ()
 @end
 @implementation B_ViewController
 - (void)viewDidLoad {
     [super viewDidLoad];
     self.title = @"B";
     self.view.backgroundColor = [UIColor whiteColor];
     self.view.backgroundColor = [UIColor whiteColor];
     UILabel *bLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 200, 100, 30)];
     bLabel.layer.borderColor = [UIColor grayColor].CGColor;
     bLabel.layer.borderWidth = 1;
     [self.view addSubview:bLabel];
     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
     button.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-50, 280, 100, 30);
     [button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
     [button setTitle:@"传值A" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
     // KVC 接收值
     bLabel.text = self.string;
 }
 - (void)buttonAction:(UIButton *)sender {
     [self.navigationController popToRootViewControllerAnimated:YES];
 }
 @end


好了,到此已经基本上介绍完页面传值了,相信你对页面传值已经有一定理解了吧,快去实践吧!



相关文章
|
4月前
ios15从隐藏系统导航栏页面进入显示系统导航栏页面后,期望系统导航栏背景色为白色,但是导航栏背景变成黑色问题
ios15从隐藏系统导航栏页面进入显示系统导航栏页面后,期望系统导航栏背景色为白色,但是导航栏背景变成黑色问题
41 0
|
4月前
|
移动开发 iOS开发 Perl
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
43 0
|
4月前
|
移动开发 Android开发 iOS开发
ios标准页面调用HTML5页面和HTML5调用ios的函数
ios标准页面调用HTML5页面和HTML5调用ios的函数
45 0
|
4月前
|
Web App开发 移动开发 Android开发
解决IOS Safari浏览器H5页面上下滑动时卡顿、页面缺失的问题
解决IOS Safari浏览器H5页面上下滑动时卡顿、页面缺失的问题
|
4月前
|
iOS开发
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
65 1
vue--ios手机input点击手机输入键盘顶起页面解决方案
vue--ios手机input点击手机输入键盘顶起页面解决方案
|
前端开发 API Android开发
Android侧滑踩坑记(仿IOS侧滑finish页面基于Slidr库)
Android侧滑踩坑记(仿IOS侧滑finish页面基于Slidr库)
254 0
|
iOS开发
iOS app跳转到系统设置页面方法
iOS app跳转到系统设置页面方法
182 0
|
iOS开发
iOS dismiss到前两级页面
iOS dismiss到前两级页面
103 0
|
iOS开发
iOS WKWebView 打开页面空白URL为空问题解决办法
iOS WKWebView 打开页面空白URL为空问题解决办法
601 0