页面传值

如果有两个页面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.运行,在编辑页面中输入信息,点击确定后,在第一个页面中展示。