兩個ViewController間傳值--回傳

在上一篇 兩個ViewController間傳值(一)中說明了如何從A傳值到B,這次要講的是如何從A進入B,在B輸入值後回傳給A,這類似於Android中的利用Activity的onActivityResult回調方法實現兩個Activity之間的值傳遞,那麼在IOS中如何實現這個功能呢,答案是使用Delegate(委託協議)。

首先來看看工程結構圖:


其中有兩個ViewController分別對應兩個界面,一個協議PassValueDelegate用來實現傳值協議,UserEntity是傳遞數據的對象。

以下是實現的效果:點擊Open進入Second界面,輸入完畢點擊OK後回到First界面並顯示結果

                       


              

下面說明關鍵代碼,完整代碼在後面有下載鏈接。

協議中聲明的方法:

  1. #import <Foundation/Foundation.h>  
  2. @class UserEntity;  
  3.   
  4. @protocol PassValueDelegate <NSObject>  
  5.   
  6. -(void)passValue:(UserEntity *)value;  
  7.   
  8. @end  

在第一個窗口實現協議:

  1. #import <UIKit/UIKit.h>  
  2. #import "PassValueDelegate.h"  
  3.   
  4. //第一個窗口遵守PassValueDelegate  
  5. @interface ViewController : UIViewController<PassValueDelegate>  
  6.   
  7. @property (retain, nonatomic) IBOutlet UILabel *nameLabel;  
  8. @property (retain, nonatomic) IBOutlet UILabel *ageLabel;  
  9. @property (retain, nonatomic) IBOutlet UILabel *gendarLabel;  
  10.   
  11. - (IBAction)openBtnClicked:(id)sender;  
  12.   
  13. @end  

.m文件中實現協議的方法:

  1. //實現協議,在第一個窗口顯示在第二個窗口輸入的值,類似Android中的onActivityResult方法  
  2. -(void)passValue:(UserEntity *)value  
  3. {  
  4.     self.nameLabel.text = value.userName;  
  5.     self.ageLabel.text = [NSString stringWithFormat:@"%d",value.age];  
  6.     self.gendarLabel.text = value.gendar;  
  7. }  

點擊Open按鈕所觸發的事件:

  1. //點擊進入第二個窗口的方法  
  2. - (IBAction)openBtnClicked:(id)sender {  
  3.     SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];  
  4.     //設置第二個窗口中的delegate爲第一個窗口的self  
  5.     secondView.delegate = self;  
  6.       
  7.     [self.navigationController pushViewController:secondView animated:YES];  
  8.     [secondView release];  
  9. }  

第二個窗口中聲明一個NSObject對象,該對象遵守PassValueDelegate協議:

  1. #import <UIKit/UIKit.h>  
  2. #import "PassValueDelegate.h"  
  3.   
  4. @interface SecondViewController : UIViewController  
  5.   
  6. @property (retain, nonatomic) IBOutlet UITextField *nameTextField;  
  7. @property (retain, nonatomic) IBOutlet UITextField *ageTextFiled;  
  8. @property (retain, nonatomic) IBOutlet UITextField *gendarTextField;  
  9.   
  10. //這裏用assign而不用retain是爲了防止引起循環引用。  
  11. @property(nonatomic,assign) NSObject<PassValueDelegate> *delegate;  
  12.   
  13. - (IBAction)okBtnClicked:(id)sender;  
  14. - (IBAction)closeKeyboard:(id)sender;  
  15.   
  16. @end  

輸入完畢後,點擊OK按鈕所觸發的事件:

  1. - (IBAction)okBtnClicked:(id)sender {  
  2.     UserEntity *userEntity = [[UserEntity alloc] init];  
  3.     userEntity.userName = self.nameTextField.text;  
  4.     userEntity.gendar = self.gendarTextField.text;  
  5.     userEntity.age = [self.ageTextFiled.text intValue];  
  6.       
  7.     //通過委託協議傳值  
  8.     [self.delegate passValue:userEntity];  
  9.     //退回到第一個窗口  
  10.     [self.navigationController popViewControllerAnimated:YES];  
  11.       
  12.     [userEntity release];  
  13. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章