StoryBoard学习(5):使用segue页面间传递数据
StoryBoard学习(5):使用segue页面间传递数据
?
?
函数:
?
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender?
具体例子:
?
1.首先创建1个Single View模版项目,然后在MainStoryboard中添加1个新的ViewContronller。并在2个View Controller中添加标签、按钮、编辑输入框。
2. 将第1页和第2页建立segue。
选中第1页中的按钮[跳到第2页],鼠标右键(或按住Controll键,鼠标左键)拖拽到第2页后,放手,在弹出菜单上选择[modal]
?
3. 将第1页中的编辑输入框组件与class文件挂钩。
单独窗口打开MainStoryboard和ViewController.h文件,然后鼠标右键拖拽编辑输入框到.h文件中的@interface的下一行。
注意,编辑输入框组件的name属性这里设置为 page1Data
?
4.在ViewController.m中添加如下代码。
?
在@implementation之后添加:
?
?
@synthesize page1Data;?
重载prepareForSegue方法:
?
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ NSString* data = page1Data.text; UIViewController* view = segue.destinationViewController; if ([view respondsToSelector:@selector(setParam:)]) { [view setValue:data forKey:@"param"]; }}
?
注意:其中的setParam和param会和下面的代码进行关联!!
?
?
5.添加新类文件并绑定给第2页。
注意:Class名为 SecondViewController
将类SecondViewController绑定到第2页.
?
6.将第2页中的编辑输入框组件绑定到类SecondViewController中。
单独窗口打开SecondViewController.h和MainStoryboard,然后选中第2页中的编辑输入框,然后鼠标右键拖拽编辑输入框到SecondViewController.h文件中的@interface的下一行。
?
注意:绑定时编辑输入框组件的name属性设置为 page2Data。
?
?
7.修改SecondViewController的.h和.m文件g">
?
?
8. 给第2页中的按钮[关闭窗口]添加事件。
单独窗口打开SecondViewController.h和MainStoryboard,然后选中第2页中的按钮[关闭窗口],右键拖拽到SecondViewController.h中@interface SecondViewController : UIViewController之后;
?
在弹出窗口的Connection属性选择Action,Name属性设置为closeWin。然后点按钮[Connect]。
?
?
可以看到,在SecondViewController.h中增加了如下代码:
?
C代码 ??
在SecondViewController.m中增加了如下代码:
?
C代码 ??
修改 SecondViewController.m中的closeWin方法,具体代码如下:
?
?
- (IBAction)closeWin:(id)sender { [self dismissViewControllerAnimated:YES completion:nil];}?
?
编译运行,当显示第2页后,点击[关闭窗口]按钮,即可关闭第2页,重新显示第1页。
?
接下来,要实现在第2页修改接收到的参数,然后将修改后的参数返回给第1页。
?
?
9. 修改 ViewController.h和.m文件内容。
?
?9.1 ViewController.h
在?@interface ViewController : UIViewController?之后添加:
?
@property (strong,nonatomic) NSString* editData;
?
注意:定义的变量 editData 是用来接收 第2页编辑输入框的内容,在 SecondViewController.m会用到!!!?
?
?
9.2 ViewController.m
在?@implementation ViewController?之后添加:
?
@synthesize editData;?
修改方法?-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
?
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ NSString* data = page1Data.text; UIViewController* view = segue.destinationViewController; if ([view respondsToSelector:@selector(setParam:)]) { [view setValue:data forKey:@"param"]; } if ([view respondsToSelector:@selector(setFirstViewController:)]) { [view setValue:self forKey:@"firstViewController"]; }}
?
注意:其中的?setFirstViewController 和?firstViewController 在下面的 SecondViewController.h和.m中会定义!!!
?
?
?
重载方法?-(void)viewWillAppear:(BOOL)animated :
?
-(void)viewWillAppear:(BOOL)animated{ NSLog(@"viewWillAppear"); [super viewWillAppear:animated]; page1Data.text=editData;}?
10. 修改 SecondViewController.h和.m文件内容。
?
10.1?SecondViewController.h
在?@interface SecondViewController : UIViewController?之后添加:
?
@property (strong,nonatomic) id firstViewController;
?
注意:变量名称 firstViewController必须和上面ViewController.m中相同!!!
?
10.2 SecondViewController.m
在 ?@implementation SecondViewController?之后添加:
?
@synthesize firstViewController;?
重载方法?-(void)viewWillDisappear:(BOOL)animated
?
-(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; if ([firstViewController respondsToSelector:@selector(setEditData:)]) { [page2Data endEditing:YES]; [firstViewController setValue:page2Data.text forKey:@"editData"]; }}
注意:其中的 ?setEditData 和 ?editData 必须和上面 ViewController.h和.m中定义的相同!!!
?
?
?
OK,编译运行。第1页的输入文字会传递到第2页的输入框中,第2页的输入框文字在关闭窗口后同样会传递给第1页的输入框中。
?
?
?
?
?
?
?
?
?
?
?
?
?
?