属性传值:从前往后传值
步骤 :
在第二个页面, 接口文件里, 声明一个NSString类型的属性, 用来做存放传递的中间结果 nsstring T
在第一个页面, 实现页面跳转的方法里, 将要传递的值赋值给第二个页面的中间变量 T = one.text
在第二个页面, 将本页面中控件的值赋值为中间变量 two.text = T
代理传值:从后往前传值
步骤:
在第二个页面中, 声明'协议
在第二个页面中, 声明协议方法(带参数)
在第二个页面中, 声明设置代理的方法(setter方法)
在第二个页面的跳转页面的方法中, 指定代理实现代理方法(带参数)
在第一个页面 , 遵循协议
在第一个页面的跳转页面中, 设置代理人
在第一个页面中, 实现代理方法
block传值: 从后往前传值
步骤:
在第二个页面中, 重命名一个block块(有参数)
在第二个页面中, 定义一个上面声明的block块的 block
在第二个页面中, 实现跳转的方法中(即: 跳转页面之前), 调用block(带有实参)
在第一个页面中, 实现跳转的方法中(即: 有第二个页面类的对象), 用第二个类的对象.block ,在block方法中实现赋值(形参)
三种页面传值实例演示
1.属性传值:从前往后传值
描述: 这里新建两个页面, RootViewController 和 SecondViewController ,我们要实现将第一个页面上的值,传递到第二个页面的效果
第一步: 在SecondViewController.h 文件中 声明一个属性
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
//声明中间变量
@property (nonatomic, retain)NSString *textString;
@end
第二步: 在RootViewController文件中, 给上面定义的中间变量赋值
这里将赋值放到了实现页面跳转的方法中, 是因为用引用第二个页面,而此方法中已经声明了一个对象(即:secondVC)
- (void)nextPage:(UINavigationItem *)next{
SecondViewController *secondVC = [SecondViewController new];
//给中间变量赋值
secondVC.textString = self.rightText.text;
[self.navigationController pushViewController:secondVC animated:YES];
}
//第三步: 在SecondViewController.m文件中, 实现传值—>赋值过程
self.rightText.text = self.textString;
______________________________________________________________________________________________________
2 .代理传值:从后往前传值
描述: 这里新建两个页面, RootViewController 和 SecondViewController ,我们要实现将第二个页面上的值,传递到第一个页面的效果
第一步: 在SecondViewController.h页面声明代理协议 , 代理方法, 及指定代理人的属性
#import <UIKit/UIKit.h>
//第一步 声明协议
@protocol secondDelegate<NSObject>
//第二步 声明代理方法
- (void)changeValue:(NSString *)value;
@end
@interface SecondViewController : UIViewController
//第三步 设置代理方法
@property (nonatomic, weak)id<secondDelegate>delegate;
@end
第二步:在SecondViewController.m文件里, 调用代理方法
这里代理方法的执行位置,可以任意!!
- (void)backAC:(UINavigationItem *)back{
//第四步 执行代理方法
[self.delegate changeValue:self.rightText.text]; [self.navigationController popViewControllerAnimated:YES];
}
第三步: 在RootViewController.m文件中遵循协议
//第五步 遵循协议
@interface RootViewController ()<secondDelegate>
第四步: 在RootViewController.m文件中
跳转方法中实现
- (void)nextPage:(UINavigationItem *)next{
SecondViewController *secondVC = [SecondViewController new];
//第六步 指定代理人
secondVC.delegate = self;
[self.navigationController pushViewController:secondVC animated:YES];
}
第五步: 在RootViewController.m文件中
第七步 实现协议方法
- (void)changeValue:(NSString *)value{
//将协议中传过来的值, 赋值给当前的label
self.leftLabel.text = value;
}
3 .block传值:从后往前传值
描述: 这里新建两个页面, RootViewController 和FirstViewController ,我们要实现将第二个页面上的值,传递到第一个页面的效果
第一步: 在FirstViewController.h重命名一个block
#import <UIKit/UIKit.h>
第一步 : 声明block方法
typedef void(^changeValueBlock)(NSString *string);
@interface FirstViewController : UIViewController
第二步 : 声明block属性
//copy : 从栈区copy到堆区来使用
@property (nonatomic, copy)changeValueBlock block;
@end
第二步: 在FirstViewController.m文件中的跳转方法内, 调用该block并传值
- (void)backAction:(UIButton *)back{
第三步 : 将要传递的内容, 作为block的参数
self.block(self.textField.text);
[self.navigationController popViewControllerAnimated:YES];
}
第三步: 在RootViewController.m文件中的跳转方法内, 调用该block并接收值
- (void)nextAC:(UIButton *)next{
FirstViewController *firstVC = [FirstViewController new];
第四步 : 实现传值(接收传递过来的内容)
__weak RootViewController *rootVC = self;
firstVC.block = ^(NSString *string){
rootVC.textLabel.text = string; };
[self.navigationController pushViewController:firstVC animated:YES];
}