Storyboard上每一根用來界面跳轉的線,都是一個UIStoryboardSegue對象(簡稱Segue)。ide
每個Segue對象,都有3個屬性:atom
(1)惟一標識代理
@property (nonatomic, readonly) NSString *identifier;orm
(2)來源控制器對象
@property (nonatomic, readonly) id sourceViewController;string
(3)目標控制器it
@property (nonatomic, readonly) id destinationViewController;io
獲取目標控制器就能夠調用目標控制器裏的方法,好比,能夠調用目標控制器的set方法給目標控制器傳遞參數。form
1、Segue的類型登錄
根據Segue的執行(跳轉)時刻,Segue能夠分爲2大類型:
自動型:點擊某個控件後(好比按鈕),自動執行Segue,自動完成界面跳轉。
手動型:須要經過寫代碼手動執行Segue,才能完成界面跳轉。
2、自動型Segue
按住Control鍵,直接從控件拖線到目標控制器:
點擊「登陸」按鈕後,就會自動跳轉到右邊的控制器。
若是點擊某個控件後,不須要作任何判斷,必定要跳轉到下一個界面,建議使用「自動型Segue」。
3、手動型Segue
按住Control鍵,歷來源控制器拖線到目標控制器。
手動型的Segue須要設置一個標識(以下圖):
在恰當的時刻,使用perform方法執行對應的Segue(跳轉到目標控制器):
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
// Segue必須由來源控制器來執行,也就是說,這個perform方法必須由來源控制器來調用。
若是點擊某個控件後,須要作一些判斷,也就是說:知足必定條件後才跳轉到下一個界面,建議使用「手動型Segue」。
4、performSegueWithIdentifier:sender:
只要調用performSegueWithIdentifier:方法就能夠執行某個Segue,完成界面跳轉,即從一個界面跳到另外一個界面。
performSegueWithIdentifier:sender:方法的完整執行過程:
(1)若是segue的style是push:
[self performSegueWithIdentifier:@「login2contacts」 sender:nil];
// 這個self是來源控制器(左邊控制器)
第一步:
根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象。
(a) 設置Segue對象的sourceViewController(來源控制器)。
(b)新建而且設置Segue對象的destinationViewController(目標控制器)。
第二步:
調用sourceViewController的下面方法,作一些跳轉前的準備工做而且傳入建立好的Segue對象,通常用這個方法給下一個控制器傳遞數據。系統自動調用該方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
// 這個sender是當初performSegueWithIdentifier:sender:中傳入的sender
例如,給下一個控制器設置title:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// 1.取得目標控制器(聯繫人列表控制器)
UIViewController *contactVc = segue.destinationViewController;
// 2.設置標題
contactVc.title = [NSString stringWithFormat:@"%@的聯繫人列表", self.accountField.text];
// contactVc.title 等價於 contactVc.navigationItem.title
//contactVc.navigationItem.title =
[NSString stringWithFormat:@"%@的聯繫人列表", self.accountField.text];
}
第三步:
調用Segue對象的- (void)perform;方法開始執行界面跳轉操做
(a)取得sourceViewController所在的UINavigationController
(b)調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉。
(2)若是segue的style是modal
調用sourceViewController的presentViewController方法將destinationViewController展現出來。
5、Sender參數的傳遞
6、控制器的數據傳遞
控制器之間的數據傳遞主要有2種狀況:順傳和逆傳。
(1)順傳
n 控制器的跳轉方向: A à C
n 數據的傳遞方向: A à C
n 數據的傳遞方式:在A的prepareForSegue:sender:方法中根據segue參數取得destinationViewController, 也就是控制器C, 直接給控制器C傳遞數據
(要在C的viewDidLoad方法中取得數據,來賦值給界面上的UI控件)
(2)逆傳
n 控制器的跳轉方向: A à C
n 數據的傳遞方向: C à A
n 數據的傳遞方式:讓A成爲C的代理, 在C中調用A的代理方法,經過代理方法的參數傳遞數據給A