天天看點

iOS 中 Storyboard 與 Xib 間控制器跳轉 - 簡化整理完整版

按以下四種情況分别說明,應該不缺啥了吧!

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 跳轉

繼續閱讀