segue和delegate实现两个页面传值
页面传值
如果有两个页面A和B之前需要传值,如下图所示,从A页面打开一个B页面,填入一些信息后,展现在B页面。这个过程需要从B页面传数据给A页面。
A->B的数据传递可以在segue中实现,B->A的数据传递则用delegate。下面分别讲述这两种传值方式。
一.segue传值
新建一个Single View应用,并在stroyboard中拖入一个viewController.并添加相应的控件,如下图所示,然后建立“编辑”按钮到页面2的model segue.
新建一个SecondViewController类,与第一个页面绑定,并关联标题和价格的textField属性。它将接收第一个页面传过来的默认值。
在第一个页面中,关联标题和价格的内容label属性。并给它们设置一个默认值。如下图所示。
在TestViewController.m中重写prepareForSegue方法,将默认值传给第二个页面。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
UIViewController *viewController=segue.destinationViewController;
SecondViewController *secondViewController=(SecondViewController *)viewController;
secondViewController.defaultTitleValue=self.titleLabel.text;
secondViewController.defaultPriceValue=self.priceLabel.text;
}
在SecondViewController.m的viewDidload方法中加入两条赋值语句,如下所示。
- (void)viewDidLoad
{
[super viewDidLoad];
self.titleTextField.text=self.defaultTitleValue;
self.priceTextField.text=self.defaultPriceValue;
}
运行,当跳转到第二个页面时,textfield中被填充了默认值 。
二、delegate传值
由于segue是单向的由A到B,那么在segue中怎么把B中产生的data传递给A。从页面B传值给A,单纯用segue难以实现。我们使用ios中一个很重要的模式,delegate。
delegate的出现与mvc(model-view-controller),protocol密切相关。 下面讲述使用delegate进行传值的思路。
一般情况下,我们会想到传一个A指针给B,当B产生了数据后,再调用A的设置方法就可以了。因此,在B中设置一个delegate属性,把它赋值为A,就可以实现上述思路。但是这并不是delegate的真相。
delegate与protocol密切相关,可以类似的理解为java中的interface。有了这一含义之后,delegate可以做的事情更多。例如有两个页面。可以共用一个B页面进行宝贝详情的编辑,编辑好后,返回A1或A2都可以,只要它们都实现了PassValueDelegate协议,然后B的delegate属性设置为实现了PassValueDelegate协议的类。
更多信息参考:delegate和protocol
下面介绍实现过程:
1.新建一个PassValueDelegate类,并在PassValueDelegate.h中声明一个protocol,代码如下。
PassValueDelegate Protocol中声明了一个setValue方法,继承此协议的类需要实现此方法。
#import <Foundation/Foundation.h>
@protocol PassValueDelegate <NSObject>
-(void)setValue:(NSDictionary *)dictionary;
@end
@interface PassValueDelegate : NSObject
@end
2.在TestViewController继承PassValueDelegate,代码如下
#import <UIKit/UIKit.h>
#import "PassValueDelegate.h"
@interface TestViewController : UIViewController<PassValueDelegate>
.......
3.在SecondViewController中声明一个Delegate属性,它是继承了PassValueDelegate的对象
4.在TestViewController.m中实现PassValueDelegate声明的方法。
#pragma mark passValueDelegate
-(void)setValue:(NSDictionary *)dictionary{
self.titleLabel.text=[dictionary objectForKey:@"titleValue"];
self.priceLabel.text=[dictionary objectForKey:@"priceValue"];
}
#pragma mark end
5.将第二个页面的确定按钮关联一个IBAction
并在自动生成的passValue代码中实现setValue方法的调用。
- (IBAction)passValue:(id)sender {
NSDictionary *dictionary=[NSDictionary dictionaryWithObjectsAndKeys:self.titleTextField.text,@"titleValue",self.priceTextField.text,@"priceValue",nil];
[self.delegate setValue:dictionary];
[self dismissViewControllerAnimated:YES completion:nil];
}
6.delegate赋值,在prepareForSegue方法中加入delegate赋值语句,代码如下
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
UIViewController *viewController=segue.destinationViewController;
SecondViewController *secondViewController=(SecondViewController *)viewController;
secondViewController.defaultTitleValue=self.titleLabel.text;
secondViewController.defaultPriceValue=self.priceLabel.text;
//delegate赋值
secondViewController.delegate=self;
}
7.运行,在编辑页面中输入信息,点击确定后,在第一个页面中展示。
转载于:https://blog.51cto.com/9299041/1550637
segue和delegate实现两个页面传值相关推荐
- 一个表单同时向两个页面传值
现在有一个表单<form action="AddNewstu.asp" METHOD="POST" ><INPUT TYPE = " ...
- 从一个html页面传值到另一个页面,两个html之间的值传递(js location.search用法)
从一个html页面传值到另一个页面,两个html之间的值传递(js location.search用法) 转载,点击跳转
- 微信小程序两个页面跳转,传值
微信小程序两个页面跳转,传值 在小程序界面,需要点击后跳转界面并且传递一个值. 具体实现如下:首先在wxml界面需要绑定事件,绑定需要传的值 a.wxml `<view bindtap=&quo ...
- iOS 中delegate的理解与使用(传值)
之前做了半年的iOS,刚入了门,又被拉去转战java,现在iOS的那位大佬离职了,又被弄过来维护app,之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便 ...
- 【C#】Web页面传值小结-
1. 使用QueryString变量 QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法 ...
- 【转】ASP.NET中页面传值
http://www.cnblogs.com/wenly/archive/2008/06/10/1216678.html 一.目前在ASP.NET中页面传值共有这么几种方式: 1.表单提交, & ...
- ASP.NET页面传值的几种方式
一.目前在ASP.NET中页面传值共有这么几种方式: 1.表单提交, <form action= "target.aspx" method = "post&q ...
- 在两个页面间翻转设置Animation动作的一些总结
今天碰到两个页面之间翻转的动作设计问题,发现了一些问题,故做个总结,很多都写在注释部分: 1.首先,我们来手动创建两个view以及相应的viewController.是手动,不是用IB (1)刚开始只 ...
- angularJs 跨控制器与跨页面传值
虽然网上概括了四种或更多的传值方式,但我现在用的顺手的就两种 首先要知道AngularJs可以构建一个单页面应用程序,所以我划分为跨控制器传值 和 跨页面传值 两类 1.跨控制器传值-- $rootS ...
最新文章
- php-URL方法下载远程图片
- 光盘 机密_使用保险柜管理机密
- java 线程不足_Java 线程基础知识
- 浙江大学远程教育计算机应用基础,浙江大学远程教育计算机应用基础.pdf
- CentOS6.2安装LAMP+DRUPAL网站(1)
- 编程科普书籍推荐(Java)
- linux设置自动关机命令,Linux中Shutdown命令实现定时自动关机
- NoSQL数据库介绍
- 用数据分析看泰坦尼克号
- 35岁鞋不合脚的问题
- 一个编程A白的真实独白
- 2020-04-15-52brain公众号目录【2020年3月】
- 工业互联网隐私保护技术
- 医美企业如何玩转私域流量?
- QT疫情信息管理系统
- python二元多次函数拟合_对python实现二维函数高次拟合的示例详解
- 七种影视截图截屏小方法
- 公共盘(网络盘)打开慢
- 微信按住说话HTML实现
- 教你给多张图片进行名称编号
热门文章
- Redis Sentinel集群部署
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇
- [原创]快速排序(C++版)
- ajax图片上传(asp.net +jquery+ashx)
- Notepad++ 插件之 TextFX (安装及作用)
- 如何在 DB2 Universal Database 中暂时禁用触发器(转)
- Optimize a Flex application using deferred instantiations
- Caliburn笔记-Action简写(wpf框架)
- 怎么才能学好Java编程写好Java代码?
- WEBBASE篇: 第五篇, CSS知识3