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的作法