属性传值可以做到从当前页将数据传入下一页.
而从下一页将值传回上一页则需要用到协议传值.
首先我创建了两个视图一个是FirstViewController,另一个是SecondViewController
协议六步:
1.创建协议
2.创建代理人属性
3.让对象遵守协议
4.设置代理为对象本身
5.在需要用到的界面写代理方法
6.通过协议将值传给代理
//SecondViewController.h 中的代码:
#import <UIKit/UIKit.h>
//第一步: 创建协议
@protocol SecondViewControllerDelegate <NSObject>
-(void)changeValue:(NSString *)value;//要交给代理的值是NSString型的(根据自己需要传值的类型来定)
@end
@interface SecondViewController : UIViewController
//第二步: 创建代理人属性
@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;
@property (nonatomic, strong) NSString *value;//公共属性,用于传值
@end
//FirstViewController.m 中的代码:
#import "FirstViewController.h"
#import "SecondViewController.h"
//第三步: 让 FirstViewController 遵守协议
@interface FirstViewController ()<UITextFieldDelegate, SecondViewControllerDelegate>
@property (nonatomic, strong) UILabel *label;//私有属性UILabel
@property (nonatomic, strong) UIButton *nextBtn;//私有属性UIButton
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//文本框
self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
self.label.center = self.view.center;
self.label.text = @"3.1415926";
self.label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:self.label];
//按钮
self.nextBtn = [UIButton buttonWithType:UIButtonTypeSystem];
[self.nextBtn setTitle:@"下一页" forState:UIControlStateNormal];
self.nextBtn.frame = CGRectMake(0, 0, 60, 30);
self.nextBtn.center = CGPointMake(self.view.center.x, self.view.center.y+100);
[self.nextBtn addTarget:self action:@selector(nextAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.nextBtn];
}
//第五步: 在 FirstViewController 里写代理方法
-(void)changeValue:(NSString *)value
{
//将 SecondViewController 传来的值赋给label.text
self.label.text = value;
}
-(void)nextAction:(id)sender//按钮方法
{
SecondViewController *second = [[SecondViewController alloc] init];
//第四步: SecondViewController 创建对象后,设置代理为 FirstViewController
second.delegate = self;
//将 FirstViewController 中的 label.text 赋给 SecondViewController 的公共属性 value
second.value = self.label.text;
//push到 SecondViewController
[self.navigationController pushViewController:second animated:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
SecondViewController.m 中的代码:
#import "SecondViewController.h"
@interface SecondViewController ()<UITextFieldDelegate>
@property (nonatomic, retain) UITextField *textField;
@property (nonatomic, strong) UIButton *backBtn;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//输入框
self.textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 100, 30)];
self.textField.center = self.view.center;
self.textField.borderStyle = UITextBorderStyleRoundedRect;
self.textField.delegate = self;
self.textField.text = self.value;//将公共属性的值赋给 textField.text
[self.view addSubview:self.textField];
//返回按钮
self.backBtn = [UIButton buttonWithType:UIButtonTypeSystem];
[self.backBtn setTitle:@"返回" forState:UIControlStateNormal];
self.backBtn.frame = CGRectMake(0, 0, 60, 30);
self.backBtn.center = CGPointMake(self.view.center.x, self.view.center.y+100);
[self.view addSubview:self.backBtn];
[self.backBtn addTarget:self action:@selector(backAction:) forControlEvents:UIControlEventTouchUpInside];
}
//按钮方法
-(void)backAction:(id)sender
{
//第六步: 让 SecondViewController 通过协议将值传给代理
//做一个判断, 当有了代理人且代理人有协议方法时才进行传值, 以免崩溃
if (self.delegate && [self.delegate respondsToSelector:@selector(changeValue:)]) {
//将自己的 textField.text 传给代理人
[self.delegate changeValue:self.textField.text];
}
//返回上一页
[self.navigationController popViewControllerAnimated:YES];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}