页面传值

如果有两个页面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实现两个页面传值相关推荐

  1. 一个表单同时向两个页面传值

    现在有一个表单<form action="AddNewstu.asp" METHOD="POST" ><INPUT TYPE = " ...

  2. 从一个html页面传值到另一个页面,两个html之间的值传递(js location.search用法)

    从一个html页面传值到另一个页面,两个html之间的值传递(js location.search用法) 转载,点击跳转

  3. 微信小程序两个页面跳转,传值

    微信小程序两个页面跳转,传值 在小程序界面,需要点击后跳转界面并且传递一个值. 具体实现如下:首先在wxml界面需要绑定事件,绑定需要传的值 a.wxml `<view bindtap=&quo ...

  4. iOS 中delegate的理解与使用(传值)

    之前做了半年的iOS,刚入了门,又被拉去转战java,现在iOS的那位大佬离职了,又被弄过来维护app,之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便 ...

  5. 【C#】Web页面传值小结-

    1.  使用QueryString变量 QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法 ...

  6. 【转】ASP.NET中页面传值

    http://www.cnblogs.com/wenly/archive/2008/06/10/1216678.html 一.目前在ASP.NET中页面传值共有这么几种方式: 1.表单提交,    & ...

  7. ASP.NET页面传值的几种方式

    一.目前在ASP.NET中页面传值共有这么几种方式: 1.表单提交,    <form action= "target.aspx" method = "post&q ...

  8. 在两个页面间翻转设置Animation动作的一些总结

    今天碰到两个页面之间翻转的动作设计问题,发现了一些问题,故做个总结,很多都写在注释部分: 1.首先,我们来手动创建两个view以及相应的viewController.是手动,不是用IB (1)刚开始只 ...

  9. angularJs 跨控制器与跨页面传值

    虽然网上概括了四种或更多的传值方式,但我现在用的顺手的就两种 首先要知道AngularJs可以构建一个单页面应用程序,所以我划分为跨控制器传值 和 跨页面传值 两类 1.跨控制器传值-- $rootS ...

最新文章

  1. php-URL方法下载远程图片
  2. 光盘 机密_使用保险柜管理机密
  3. java 线程不足_Java 线程基础知识
  4. 浙江大学远程教育计算机应用基础,浙江大学远程教育计算机应用基础.pdf
  5. CentOS6.2安装LAMP+DRUPAL网站(1)
  6. 编程科普书籍推荐(Java)
  7. linux设置自动关机命令,Linux中Shutdown命令实现定时自动关机
  8. NoSQL数据库介绍
  9. 用数据分析看泰坦尼克号
  10. 35岁鞋不合脚的问题
  11. 一个编程A白的真实独白
  12. 2020-04-15-52brain公众号目录【2020年3月】
  13. 工业互联网隐私保护技术
  14. 医美企业如何玩转私域流量?
  15. QT疫情信息管理系统
  16. python二元多次函数拟合_对python实现二维函数高次拟合的示例详解
  17. 七种影视截图截屏小方法
  18. 公共盘(网络盘)打开慢
  19. 微信按住说话HTML实现
  20. 教你给多张图片进行名称编号

热门文章

  1. Redis Sentinel集群部署
  2. ASP.NET Core Web 支付功能接入 微信-扫码支付篇
  3. [原创]快速排序(C++版)
  4. ajax图片上传(asp.net +jquery+ashx)
  5. Notepad++ 插件之 TextFX (安装及作用)
  6. 如何在 DB2 Universal Database 中暂时禁用触发器(转)
  7. Optimize a Flex application using deferred instantiations
  8. Caliburn笔记-Action简写(wpf框架)
  9. 怎么才能学好Java编程写好Java代码?
  10. WEBBASE篇: 第五篇, CSS知识3