storyboard页面切换与传值

Easter79
• 阅读 714

一、storyboard页面切换

假设view controller1下有一个button1,view controller2下有一个button2,我们要实现storyboard在这两个view controller之间切换。

1、 Controller1切换Controller2

在storyboard界面下,点住button1,右键拖动至controller2,松手,选择Modal

2、Controller2切回Contrller1

这里要注意不能使用刚刚的方式了,因为刚刚的方式是一个界面“前往”另一个界面,而不是“返回”另一个界面,换句话说,“前往”会新建很多controller,我们应该“返回”,虽然这两者表面上看上去好像差不多

1)、 cmd+n新建一个UIViewController的subClass,命名为Page2ViewController,不要创建xib,因为它的xib实际上就是view controller2

2)、选中View Controller2,将它的Custom Class设置为Page2ViewController。其实就是指明一下,这个xib就是给Page2ViewController类调用的。

storyboard页面切换与传值

如果发现下拉列表中没有Page2ViewController,请确认选择的是View Controller2

3)、使用右键拖动的方式在Page2ViewController.h创建一个Action:returnToFirstPage

storyboard页面切换与传值

4)、返回Page2ViewController.m,调用

dismissViewControllerAnimated:completion:

方法完成返回动作

- (IBAction)returnToFirstPage:(id)sender {  

   [self  dismissViewControllerAnimated:YES  completion:^{}];  

}  

正常情况下你会看到View Controller2是以出现方式相反的方式关闭的

二、srotyboard之间传值

假设view controller1下有一个button1和一个textField1,view controller2下有一个button2和一个textField2,我们要实现摁下button1将textField1的内容传送给textField2,按下button2将textField2的内容传送给textField1。

首先还是要将textField1和textField2使用右键拖动的方式在各自的h文件下命名好调用

storyboard页面切换与传值

1、textField1传送给textField2

使用segue代理的方式。

1)、在view controller2的Page2ViewController.h文件下设置一个NSString类型的变数,它的目的是用来接收由页面 1 透过 Storyboard Segue 所传过来的资讯,程式码如下。

@property (weak, nonatomic) NSString *exchangeString;  

//别忘了在对应的实作档中加入@synthesize string;  

2)、设定在view controller2加载的时候即将textField2的text设置为传递过来的exchangeString

- (void)viewDidLoad

{

   [superviewDidLoad];

   textField2.text = exchangeString;

}

3)、在view controller1的m文件中调用prepareForSegue:sender:方法将值传递给textField2

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   //将page2设定成Storyboard Segue的目标UIViewController  

   id page2 = segue.destinationViewController;   

   //将值透过Storyboard Segue带给页面2的string变数  

   [page2 setValue:textField1.textforKey:@"exchangeString"];  

}  

4)、虽然做到上面这步已经可以正确传递值了,但是如果直接运行,会发现textField1的弹出框一旦弹出就无法关闭。所以还需要执行如下操作:

在storyboard中选中textField1,使用右键拖动的方式建立一个Action

storyboard页面切换与传值

然后将此方法在m文件中实现出来

- (IBAction)closeTextField:(id)sender {

   [sender resignFirstResponder];

}

2、textField2返还传送给textField1

将会用到代理和协议的方式。

透过建立一个协定 @protocol 的方式,让其它的採纳此协定的 class 可以实作协定内的函式,我们在页面 2 的 UIViewController class 里设置一个协定,并且在页面 1 的 UIViewController class 里实作协定里的方法,让程式执行到页面 2 时,仍然能够取得页面 1 的实例 Instance,进而使用协定里的方法来设定 textField 2的数值。

1)、在页面2的Page2ViewController.h文件下设定协议

//建立一个协定  

@protocol Page2Delegate  

//协定中的方法  

- (void)passValue:(NSString *)value;  

@end  

同时在Page2ViewController类的声明里添加一个协议的物件

@interface Page2ViewController : UIViewController

- (IBAction)returnToFirstPage:(id)sender;

@property (weak, nonatomic) IBOutletUITextField *textField2;

@property (weak, nonatomic) NSString *exchangeString;  

//宣告一个採用Page2Delegate协定的物件

@property (weak, nonatomic) id delegate;   //记得@synthesize

@end

2)、设定该协议物件记录值的位置,肯定是在返回第一个View Controller的时候记录咯

- (IBAction)returnToFirstPage:(id)sender {  

   [selfdismissViewControllerAnimated:YEScompletion:^{}];  

//呼叫协定中的方法并带入page2textField的数值

[delegatepassValue:textField2.text];

}  

3)、在view controller1的m文件中实现协议相关内容

首先声明调用定义协议的h文件(可以放到h文件中)

//引用持有Page2Delegate协定的class  

#import "Page2ViewController.h"  

然后实现协议约定的方法

- (void)passValue:(NSString *)value {  

   //设定page1TextField为所取的的数值  

   textField1.text = value;  

}  

4)、重点提出的:记得要将代理 delegate 设成自己

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  

   //将page2设定成Storyboard Segue的目标UIViewController  

   id page2 = segue.destinationViewController;     

   //将值透过Storyboard Segue带给页面2的string变数  

   [page2 setValue:textField1.textforKey:@"exchangeString"];  

//将delegate设成自己(指定自己为代理)

[page2 setValue:selfforKey:@"delegate"];

}  

运行前要将textField2也做一个点击Return Key缩小小键盘的设定,方法参照textField1的做法

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
AWS国庆双重礼,仅限7天
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠AWS精美祥云纪念T恤一件。$200美元A
国庆假期玩不停,双重好礼放肆领
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠AWS精美祥云纪念T恤一件。,仅限7天AW
国庆假期玩不停双重好礼放肆领
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠AWS精美祥云纪念T恤一件。,仅限7天AW
AWS国庆双重礼,仅限7天
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠AWS精美祥云纪念T恤一件。,仅限7天$20
AWS国庆双重礼,仅限7天
自2021年10月1日00:00起至2021年10月7日24:00,新注册并激活(需全部完成账号注册的五个步骤,否则账号状态并未激活)AWS海外区域账户,填写页面下方表单,即可申领价值$200美元的AWS海外区域账户服务抵扣券直充到您的账户,用以抵扣服务消费,助您轻松体验多个云迁移应用场景。同时,您还可获赠AWS精美祥云纪念T恤一件。,仅限7天$20
Easter79 Easter79
3年前
Storyboard全解析
故事版(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图:!Thefullstoryboardwe'llbemakinginthistutorial.(http://static.oschina.net/uploa
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k