页面传值
如果有两个页面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方法,将默认值传给第二个页面。
}
在SecondViewController.m的viewDidload方法中加入两条赋值语句,如下所示。
}
运行,当跳转到第二个页面时,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>-(void)setValue:(NSDictionary *)dictionary;
@end
@interface PassValueDelegate : NSObject
@end
2.在TestViewController继承PassValueDelegate,代码如下
@interface TestViewController : UIViewController<PassValueDelegate>
.......
3.在SecondViewController中声明一个Delegate属性,它是继承了PassValueDelegate的对象
4.在TestViewController.m中实现PassValueDelegate声明的方法。
#pragma mark end
5.将第二个页面的确定按钮关联一个IBAction
并在自动生成的passValue代码中实现setValue方法的调用。
}
6.delegate赋值,在prepareForSegue方法中加入delegate赋值语句,代码如下
secondViewController.defaultPriceValue=self.priceLabel.text;
//delegate赋值
secondViewController.delegate=self;}
7.运行,在编辑页面中输入信息,点击确定后,在第一个页面中展示。
出在:http://www.taobaotest.com/blogs/2381