代理传值和属性传值

代理很重要

传值有三种(我现在知道的有三种),分别为代理传值,属性传值,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.
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值