代理很重要
传值有三种(我现在知道的有三种),分别为代理传值,属性传值,block传值
这篇主要介绍代理,也用到了属性传值,但属性传值有弊端。
代理传值的步骤
1.属性传值:
一般用于上级页面传值到下级页面,属性声明在下级页面,用于接收上级传过来的值.
2.代理传值:
实质:通过协议方法中的<参数>实现值传递:如- (void)sendValue:(NSString *)text
口诀:①.哪个页面(类)需要值,这个页面(类)即代理,协议方法的实现和遵守协议以及设置代理就写在哪个页面(类)里.
②.声明代理属性,就写在传值的那个页面(类)里,这个页面(类)即委托人.
难点
③.想什么时候将值传过去,那就是让[代理 执行协议方法:实参值];
//注意:如果想用好代理-协议:
①.要明确谁是委托人:registerVC
②.谁是代理:loginVC
③.委托人要让代理做什么事:RegisterViewControllerDelegate
其实:
registerVC只是负责将值传到上级页面(代理),代理接收到值,至于接收到的值,代理loginVC怎么处理,registerVC不管.
第一步声明协议
#import <Foundation/Foundation.h>
@protocol RegisterViewControllerDelegater <NSObject>
@required
@optional
//传过去两个值的话使用两个参数,当需要的多的话,传过去数组
-(void)sendValue:(NSString *)text;
@end
第二步
遵守协议
#import <UIKit/UIKit.h>
#import "RegisterViewControllerDelegater.h"
//第二步 遵守协议
@interface LoginViewController : UIViewController<RegisterViewControllerDelegater>
@end
第三步
实现协议
#import "LoginViewController.h"
#import "RegisterViewController.h"
@interface LoginViewController ()
@property(nonatomic,retain)UILabel * label;
@property(nonatomic,retain)UITextField *textField;
@property(nonatomic,retain)RegisterViewController * registerVC;
@end
@implementation LoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
// self.navigationItem.title =
#pragma mark===============创建UILabel,UITextField,UIBarButtonItem
self.label = [[UILabel alloc]initWithFrame:CGRectMake(100, 300, 150, 30)];
_label.backgroundColor = [UIColor whiteColor];
// _label.text = @"登陆";
_label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:_label];
[_label release];
//将用户输入的值,传入到下一页面
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 400, 150, 30)];
_textField.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:_textField];
[_textField release];
//3.点击BarButtonItem推出下一级页面
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithTitle:@"注册" style:UIBarButtonItemStylePlain target:self action:@selector(clickNextView:)];
self.navigationItem.rightBarButtonItem = buttonItem;
// Do any additional setup after loading the view.
}
-(void)clickNextView:(UIBarButtonItem *)barButtonItem{
RegisterViewController *registerVC = [[RegisterViewController alloc]init];
//第四步,设置代理
registerVC.delegate = self;
//进行属性传值
registerVC.text = _textField.text;
[self.navigationController pushViewController:registerVC animated:YES];
[registerVC release];
}
//第三步,实现协议中的方法
-(void)sendValue:(NSString *)text{
_label.text = text;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
第四步
设置代理属性
#import <UIKit/UIKit.h>
#import "RegisterViewControllerDelegater.h"
@interface RegisterViewController : UIViewController
//声明一个代理属性,(因为registerVC是委托人,它要拥有一个delegate属性,用来设置代理的)
@property(nonatomic,retain)id<RegisterViewControllerDelegater> delegate;
//接受上一级页面传过来的值
@property(nonatomic,retain)NSString * text;
@end
第五步
实现代理的方法
#import "RegisterViewController.h"
@interface RegisterViewController ()
@property(nonatomic,retain)UILabel * label;
@property(nonatomic,retain)UITextField *textField;
@end
@implementation RegisterViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = _text;
self.view.backgroundColor = [UIColor redColor];
self.label = [[UILabel alloc]initWithFrame:CGRectMake(100, 300, 150, 30)];
_label.backgroundColor = [UIColor whiteColor];
_label.text = @"登陆";
_label.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:_label];
[_label release];
//将用户输入的值,传入到下一页面
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 400, 150, 30)];
_textField.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:_textField];
[_textField release];
//3.点击BarButtonItem推出下一级页面
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc]initWithTitle:@"POP" style:UIBarButtonItemStylePlain target:self action:@selector(clickNextView:)];
self.navigationItem.rightBarButtonItem = buttonItem;
// Do any additional setup after loading the view.
}
**这里是难点**
(void)clickNextView:(UIBarButtonItem *)buttonItem{
[self.navigationController popViewControllerAnimated:YES];
// if ([_delegate respondsToSelector:@selector(settValue:)]) {
[_delegate sendValue:_textField.text];
// }
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}