storyboard頁面切換與傳值

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;  

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

相關文章
相關標籤/搜索