zoukankan      html  css  js  c++  java
  • 使用Delegate在两个ViewController之间传值


    以下就实现了使用Delegate在两个ViewController之间传值,这种场景一般应用在进入子界面输入信息,完后要把输入的信息回传给前一个界面的情况,比如修改用户个人信息,点击修改进入修改界面,修改完后到显示界面显示修改后的结果。

    协议中声明的方法:

    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. - (IBAction)openBtnClicked:(id)sender {  
    2.     SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];  
    3.     //设置第二个窗口中的delegate为第一个窗口的self  
    4.     secondView.delegate = self;  
    5.       
    6.     [self.navigationController pushViewController:secondView animated:YES];  
    7.     [secondView release];  
    8. }  


    第二个窗口中声明一个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. }  
  • 相关阅读:
    uni-app、VUE、微信小程序之异同
    git学习之通俗易懂篇(四)
    css学习之-----flex布局
    git学习之通俗易懂篇(三)
    git学习之通俗易懂篇(二)
    防止非法登录
    MVC 路由配置
    C# 跨线程调用控件
    【推荐】gitee 的使用,sts4公钥私钥的配置,
    查看java的springboot的内存占用
  • 原文地址:https://www.cnblogs.com/niexiaobo/p/4446487.html
Copyright © 2011-2022 走看看