在上一篇 兩個ViewController間傳值(一)中說明了如何從A傳值到B,這次要講的是如何從A進入B,在B輸入值後回傳給A,這類似於Android中的利用Activity的onActivityResult回調方法實現兩個Activity之間的值傳遞,那麼在IOS中如何實現這個功能呢,答案是使用Delegate(委託協議)。
首先來看看工程結構圖:
其中有兩個ViewController分別對應兩個界面,一個協議PassValueDelegate用來實現傳值協議,UserEntity是傳遞數據的對象。
以下是實現的效果:點擊Open進入Second界面,輸入完畢點擊OK後回到First界面並顯示結果
下面說明關鍵代碼,完整代碼在後面有下載鏈接。
協議中聲明的方法:
- #import <Foundation/Foundation.h>
- @class UserEntity;
- @protocol PassValueDelegate <NSObject>
- -(void)passValue:(UserEntity *)value;
- @end
在第一個窗口實現協議:
- #import <UIKit/UIKit.h>
- #import "PassValueDelegate.h"
- //第一個窗口遵守PassValueDelegate
- @interface ViewController : UIViewController<PassValueDelegate>
- @property (retain, nonatomic) IBOutlet UILabel *nameLabel;
- @property (retain, nonatomic) IBOutlet UILabel *ageLabel;
- @property (retain, nonatomic) IBOutlet UILabel *gendarLabel;
- - (IBAction)openBtnClicked:(id)sender;
- @end
.m文件中實現協議的方法:
- //實現協議,在第一個窗口顯示在第二個窗口輸入的值,類似Android中的onActivityResult方法
- -(void)passValue:(UserEntity *)value
- {
- self.nameLabel.text = value.userName;
- self.ageLabel.text = [NSString stringWithFormat:@"%d",value.age];
- self.gendarLabel.text = value.gendar;
- }
點擊Open按鈕所觸發的事件:
- //點擊進入第二個窗口的方法
- - (IBAction)openBtnClicked:(id)sender {
- SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];
- //設置第二個窗口中的delegate爲第一個窗口的self
- secondView.delegate = self;
- [self.navigationController pushViewController:secondView animated:YES];
- [secondView release];
- }
第二個窗口中聲明一個NSObject對象,該對象遵守PassValueDelegate協議:
- #import <UIKit/UIKit.h>
- #import "PassValueDelegate.h"
- @interface SecondViewController : UIViewController
- @property (retain, nonatomic) IBOutlet UITextField *nameTextField;
- @property (retain, nonatomic) IBOutlet UITextField *ageTextFiled;
- @property (retain, nonatomic) IBOutlet UITextField *gendarTextField;
- //這裏用assign而不用retain是爲了防止引起循環引用。
- @property(nonatomic,assign) NSObject<PassValueDelegate> *delegate;
- - (IBAction)okBtnClicked:(id)sender;
- - (IBAction)closeKeyboard:(id)sender;
- @end
輸入完畢後,點擊OK按鈕所觸發的事件:
- - (IBAction)okBtnClicked:(id)sender {
- UserEntity *userEntity = [[UserEntity alloc] init];
- userEntity.userName = self.nameTextField.text;
- userEntity.gendar = self.gendarTextField.text;
- userEntity.age = [self.ageTextFiled.text intValue];
- //通過委託協議傳值
- [self.delegate passValue:userEntity];
- //退回到第一個窗口
- [self.navigationController popViewControllerAnimated:YES];
- [userEntity release];
- }