1、storyboard页面切换 atom
假设view controller1下有一个button1,view controller2下有一个button2,咱们要实现storyboard在这两个view controller之间切换。 spa
一、 Controller1切换Controller2 .net
在storyboard界面下,点住button1,右键拖动至controller2,松手,选择Modal 代理
二、Controller2切回Contrller1 get
这里要注意不能使用刚刚的方式了,由于刚刚的方式是一个界面“前往”另外一个界面,而不是“返回”另外一个界面,换句话说,“前往”会新建不少controller,咱们应该“返回”,虽然这二者表面上看上去好像差很少 cmd
1)、 cmd+n新建一个UIViewController的subClass,命名为Page2ViewController,不要建立xib,由于它的xib实际上就是view controller2 string
2)、选中View Controller2,将它的Custom Class设置为Page2ViewController。其实就是指明一下,这个xib就是给Page2ViewController类调用的。 io
若是发现下拉列表中没有Page2ViewController,请确认选择的是View Controller2 class
3)、使用右键拖动的方式在Page2ViewController.h建立一个Action:returnToFirstPage import
4)、返回Page2ViewController.m,调用
dismissViewControllerAnimated:completion:
方法完成返回动做
- (IBAction)returnToFirstPage:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{}];
}
正常状况下你会看到View Controller2是以出现方式相反的方式关闭的
2、srotyboard之间传值
假设view controller1下有一个button1和一个textField1,view controller2下有一个button2和一个textField2,咱们要实现摁下button1将textField1的内容传送给textField2,按下button2将textField2的内容传送给textField1。
首先仍是要将textField1和textField2使用右键拖动的方式在各自的h文件下命名好调用
一、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
而后将此方法在m文件中实现出来
- (IBAction)closeTextField:(id)sender {
[sender resignFirstResponder];
}
二、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;
同时在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
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的作法