代理傳值和屬性傳值

代理很重要

傳值有三種(我現在知道的有三種),分別爲代理傳值,屬性傳值,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.
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章