在上一篇 两个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];
- }
以上就实现了使用Delegate在两个ViewController之间传值,这种场景一般应用在进入子界面输入信息,完后要把输入的信息回传给前一个界面的情况,比如修改用户个人信息,点击修改进入修改界面,修改完后到显示界面显示修改后的结果。
源码下载:完整代码
相关推荐
本篇将详细介绍如何在两个ViewController之间利用委托协议进行值传递,以及它与Android中`onActivityResult`方法的相似之处。 首先,我们需要理解什么是委托协议。在Objective-C或Swift中,委托是一种设计模式,...
本文将详细介绍如何在两个ViewController之间实现数据的传递,主要聚焦于基本的Objective-C编程环境,适用于初学者和有一定经验的开发者。 首先,让我们理解ViewController间的通信机制。在iOS中,有多种方法可以...
首先,定义一个协议,该协议包含你希望在两个ViewController之间传递的属性或方法。然后,让接收值的ViewController成为发送值的ViewController的代理。在发送值的ViewController中,当需要传递数据时,通过代理协议...
标题“两个controller相互传值”和描述“iOS实现在两个ViewController间传值”都指向了这个核心主题。在这个场景下,我们可以使用两种主要的方法:协议(Protocol)传值和控制器(Controller)传值。下面我们将详细...
在两个ViewController间,我们可以创建一个Block属性在第二个ViewController中,然后在第一个ViewController中设置这个Block并传递数据。当需要传递数据时,直接执行Block,这样数据就会在Block的执行上下文中被处理...
-- 使用Delegate在两个ViewController间传值 -- 内存泄露Demo leaky app -- iOS上拉加载更多的实现 -- iOS视频通话/直播demo -- 数据库操作(使用FMDB) -- iOS图文混排(模仿新浪微博) -- IOS高仿微信聊天对话界面 -...
"ios 通过delegete委托 在两个界面进行传值"这个标题涉及的关键知识点是使用委托(Delegate)协议来实现在多个界面之间的数据传递。下面将详细介绍这一过程,并给出实际操作步骤。 首先,我们需要理解什么是委托...
我们将深入探讨这两个概念,并通过实际应用示例来阐述它们的工作原理。 首先,我们来看“普通传值”。普通传值通常指的是在程序的不同组件之间直接传递基本数据类型(如整型、浮点型、字符串等)或者对象实例。这在...
在iOS应用开发中,数据传输是常见的操作,而使用Block(闭包)可以在两个页面间进行灵活且简洁的值传递。Block相比于传统的Delegate(代理)和NSNotification(通知)方式,具有更加直观和易于理解的特性。本文将...
通过创建两个模拟的ViewController,实现数据从B到A的传递,可以加深对Notification理解和应用。 总之,逆向传值通过Notification实现,允许视图控制器间灵活的数据通信,尤其适用于不希望或无法建立强引用关系的...
在"blockValuePage"这个示例中,可能包含了两个页面:一个是发起传值的页面(可能是ViewControllerA),另一个是接收并返回值的页面(可能是ViewControllerB)。在ViewControllerA中,我们可能会创建一个Block,并将...
在这个主题中,我们将深入探讨如何在Objective-C或Swift中实现这两种功能,以创建更加互动和功能丰富的iOS应用。 **页面跳转** 1. **导航控制器(Navigation Controller)**: iOS中最常见的页面跳转方式是通过...
5. **Model Objects**:如果数据属于模型对象的一部分,可以直接在模型对象中存储,两个ViewController都可以访问同一个模型对象,实现数据共享。 在"NavigationDemo"这个项目中,我们可以预期看到如何通过...
本教程将详细讲解如何在Swift 3.0环境下,实现导航页间的相互传值。 一、基本概念 在Swift 3.0中,传值主要通过两种方式实现:属性代理(Property Delegate)和协议委托(Protocol Delegate)。另外,还可以利用 ...
现有两个视图(ViewController,ViewController1),从ViewController中带参数跳转到ViewController1,在ViewController1选中数据后带有效数据后退到ViewController中,委托实现上述功能。 可以参考:...
在iOS应用中,我们经常用代理来传递数据或事件,特别是在两个不直接相关或者不想直接耦合的对象之间。例如,一个视图控制器可能需要知道用户在表视图中进行了哪些操作,这时就可以通过定义一个代理来实现。 在这个...
"实体类传值"是将对象或数据从一个视图控制器(ViewController)传递到另一个视图控制器的一种常见方式。在这个过程中,我们通常会涉及到变量的创建、赋值以及在不同类之间的共享。本篇文章将深入探讨实体类传值和...
在标题“代理传值 简单实现”和描述“这是UITextField 和 UILabel之间的简单传值”中,我们关注的是如何通过代理协议来实现在这两个UI组件之间传递数据。代理模式是Objective-C和Swift中常见的一种设计模式,用于...
2. **模型对象(Model Object)**:将共享数据封装在一个模型对象中,两个VC都可以访问。 3. **NSUserDefault**:用于存储用户偏好设置,也可以临时存储较小量的数据。 4. **单例(Singleton)**:创建一个全局可...
UIStoryboardSegue是UIKit框架中的一个类,用于在两个UIViewController实例间建立链接。当用户触发一个segue(如点击按钮),系统会自动执行 segue 的 prepare(for:sender:) 方法,这为我们提供了传递数据的机会。 ...