代理很重要
傳值有三種(我現在知道的有三種),分別爲代理傳值,屬性傳值,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.
}