`
dcj3sjt126com
  • 浏览: 1867059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

两个ViewController间传值(二)

    博客分类:
  • IOS
 
阅读更多

在上一篇 两个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. }  


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

 

源码下载:完整代码

分享到:
评论

相关推荐

    使用Delegate在两个ViewController间传值

    本篇将详细介绍如何在两个ViewController之间利用委托协议进行值传递,以及它与Android中`onActivityResult`方法的相似之处。 首先,我们需要理解什么是委托协议。在Objective-C或Swift中,委托是一种设计模式,...

    IOS实现在两个ViewController间传值(一)

    本文将详细介绍如何在两个ViewController之间实现数据的传递,主要聚焦于基本的Objective-C编程环境,适用于初学者和有一定经验的开发者。 首先,让我们理解ViewController间的通信机制。在iOS中,有多种方法可以...

    ios实现viewcontroller切换传值的三种方法

    首先,定义一个协议,该协议包含你希望在两个ViewController之间传递的属性或方法。然后,让接收值的ViewController成为发送值的ViewController的代理。在发送值的ViewController中,当需要传递数据时,通过代理协议...

    两个controller相互传值

    标题“两个controller相互传值”和描述“iOS实现在两个ViewController间传值”都指向了这个核心主题。在这个场景下,我们可以使用两种主要的方法:协议(Protocol)传值和控制器(Controller)传值。下面我们将详细...

    ByValueTwoViewController-iOS:2个ViewController直接传值的方式事例

    在两个ViewController间,我们可以创建一个Block属性在第二个ViewController中,然后在第一个ViewController中设置这个Block并传递数据。当需要传递数据时,直接执行Block,这样数据就会在Block的执行上下文中被处理...

    IOS 20个实用例子.zip

    -- 使用Delegate在两个ViewController间传值 -- 内存泄露Demo leaky app -- iOS上拉加载更多的实现 -- iOS视频通话/直播demo -- 数据库操作(使用FMDB) -- iOS图文混排(模仿新浪微博) -- IOS高仿微信聊天对话界面 -...

    ios 通过delegete委托 在两个界面进行传值

    "ios 通过delegete委托 在两个界面进行传值"这个标题涉及的关键知识点是使用委托(Delegate)协议来实现在多个界面之间的数据传递。下面将详细介绍这一过程,并给出实际操作步骤。 首先,我们需要理解什么是委托...

    普通传值正向传值

    我们将深入探讨这两个概念,并通过实际应用示例来阐述它们的工作原理。 首先,我们来看“普通传值”。普通传值通常指的是在程序的不同组件之间直接传递基本数据类型(如整型、浮点型、字符串等)或者对象实例。这在...

    iOS通过block在两个页面间传值的方法

    在iOS应用开发中,数据传输是常见的操作,而使用Block(闭包)可以在两个页面间进行灵活且简洁的值传递。Block相比于传统的Delegate(代理)和NSNotification(通知)方式,具有更加直观和易于理解的特性。本文将...

    逆向传值之通知传值

    通过创建两个模拟的ViewController,实现数据从B到A的传递,可以加深对Notification理解和应用。 总之,逆向传值通过Notification实现,允许视图控制器间灵活的数据通信,尤其适用于不希望或无法建立强引用关系的...

    ios-block逆传值页面间的.zip

    在"blockValuePage"这个示例中,可能包含了两个页面:一个是发起传值的页面(可能是ViewControllerA),另一个是接收并返回值的页面(可能是ViewControllerB)。在ViewControllerA中,我们可能会创建一个Block,并将...

    页面间跳转和传值

    在这个主题中,我们将深入探讨如何在Objective-C或Swift中实现这两种功能,以创建更加互动和功能丰富的iOS应用。 **页面跳转** 1. **导航控制器(Navigation Controller)**: iOS中最常见的页面跳转方式是通过...

    故事模式导航传值

    5. **Model Objects**:如果数据属于模型对象的一部分,可以直接在模型对象中存储,两个ViewController都可以访问同一个模型对象,实现数据共享。 在"NavigationDemo"这个项目中,我们可以预期看到如何通过...

    iOS swift3.0 导航页的相互传值

    本教程将详细讲解如何在Swift 3.0环境下,实现导航页间的相互传值。 一、基本概念 在Swift 3.0中,传值主要通过两种方式实现:属性代理(Property Delegate)和协议委托(Protocol Delegate)。另外,还可以利用 ...

    ios两视图间委托(delegate)传值

    现有两个视图(ViewController,ViewController1),从ViewController中带参数跳转到ViewController1,在ViewController1选中数据后带有效数据后退到ViewController中,委托实现上述功能。 可以参考:...

    iOS 代理传值简单demo

    在iOS应用中,我们经常用代理来传递数据或事件,特别是在两个不直接相关或者不想直接耦合的对象之间。例如,一个视图控制器可能需要知道用户在表视图中进行了哪些操作,这时就可以通过定义一个代理来实现。 在这个...

    实体类传值

    "实体类传值"是将对象或数据从一个视图控制器(ViewController)传递到另一个视图控制器的一种常见方式。在这个过程中,我们通常会涉及到变量的创建、赋值以及在不同类之间的共享。本篇文章将深入探讨实体类传值和...

    代理传值 简单实现

    在标题“代理传值 简单实现”和描述“这是UITextField 和 UILabel之间的简单传值”中,我们关注的是如何通过代理协议来实现在这两个UI组件之间传递数据。代理模式是Objective-C和Swift中常见的一种设计模式,用于...

    导航器传值Demo

    2. **模型对象(Model Object)**:将共享数据封装在一个模型对象中,两个VC都可以访问。 3. **NSUserDefault**:用于存储用户偏好设置,也可以临时存储较小量的数据。 4. **单例(Singleton)**:创建一个全局可...

    ios故事版传值 segue

    UIStoryboardSegue是UIKit框架中的一个类,用于在两个UIViewController实例间建立链接。当用户触发一个segue(如点击按钮),系统会自动执行 segue 的 prepare(for:sender:) 方法,这为我们提供了传递数据的机会。 ...

Global site tag (gtag.js) - Google Analytics