按以下四種情況分别說明,應該不缺啥了吧!
Xib.controller <=> Xib.controller
Storyboard.controller <=> Storyboard.controller
Storyboard.controller <=> Xib.controller
Xib.controller <=> Storyboard.controller
==========
補充:
還有一種特例,就是同一個 Storyboard 中的 controller 間跳轉。
=========
再補充:
複用單元的建構,xib 中或 Storyboard 中。
===============================================================
終極簡化兩步:
一是擷取到視圖控制器執行個體,隻有兩種情況,xib 和 storyboard,代碼直接建構不算手畫界面部分不在讨論範疇:
A、從 xib :AaaViewController *aaaViewController = [[AaaViewController alloc] initWithNibName:@"AaaViewController" bundle:nil];
B、從 storyboard :假設 BbbViewController 視圖控制器在 www.storyboard 中,并且其 storyboardid 為 BbbViewController
UIStoryboard *wwwSB = [UIStoryboard storyboardWithName:@"www" bundle:nil];
BbbViewController *bbbViewController = [wwwSB INSTANTIATEvIEWcONTROLLERwITHiDENTIFIER:@"BbbViewController"];
a、簡化一:如果目前控制器和要壓入的控制器在同一個 storyboard 的話,可以省略建構 UIStoryboard ,直接使用 self.storyboard 替代 wwwSB,
一個 storyboard 控制器被加載,其 storyboard 被預設儲存為屬性便于使用。
b、簡化二:當 storyboard 中的視圖控制器沒有設定 storyboardid 時,而在該 storyboard 中的控制器間使用 segue 進行了關聯,那麼可以執行 segue 完成跳轉,
當然 segue 也需要設定 identifier :
[self performSegueWithIdentifier:@"SegueToPersonCenter" sender:sender];
架構内部直接執行個體化了這個 identifier 對應的 segue 跳轉到的視圖控制器,那麼就會有問題出現了,以往可以自已執行個體化,然後設定目标控制器的屬性,現在怎麼辦?
看下面這個回調方法,在跳轉前會被執行,給一個設定的機會:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
}
這裡的 sender 這裡的 sender 就是上面的傳入參數 sender,也可以在控制器的别名分類中設定私有屬性暫存參數,然後在此回調中使用。
c、簡化三:如果是剛開始為了快速建構控制器間的流轉,也即草圖階段,不關心細節,那麼可能連 segue 都不用,直接在按鈕上往目标控制器上一拉選,點按鈕就跳轉了。
二是将此視圖控制器壓入導航控制器堆棧或模态呈現:
這個确實沒什麼可說的,與正常一樣,也列一下吧:
[self.navigationController pushViewController:aaaViewController animated:YES];
[self presentViewController:bbbViewController animated:YES completion:^{}];
描述完成,基本沒有遺漏了吧,關鍵的東西都在第一步中,視圖控制器的執行個體化與設定上,
相對來講,越簡便的方法越受束縛,越麻煩的方法,給你的自由度越高,蘋果在這方面面面俱到了。
可以所有的控制器在一個 storyboard 中,使用 segue 跳轉