折騰了一成天,本文總結一下ios7.0頁面跳轉有關的內容javascript
storyboard的潛規則
我接觸ios很晚,環境已是xcode5+ios7,因此對之前的IOS開發模式並不瞭解。在網上查閱了不少資料,發現之前的代碼,不少都須要本身coding來建立ViewController,好比:html
- WTwoViewController *controller = [[WTwoViewController alloc]initWithNibName:@"WTwoViewController" bundle:nil];
- [self presentViewController:controller animated:YES completion:nil];
可是用storyboard來管理view controller的話,storyboard會自動處理view controller的初始化動做,因此就再也不須要本身coding來建立view controller的實例。在另一篇博客裏看到這句話:java
「用過xib的人我相信不少人都會常常用到-presentModalViewController:animated:以及-pushViewController:animated:這兩個方法。這種代碼在storyboard裏將成爲歷史;取而代之的是Segue」ios
基於控件的跳轉
用storyboard作開發,常常須要拉線,本文不介紹,請看這篇官方文檔:web
start developing iOS app todaybootstrap
這種拉線,是從button拉到view controller:api
這種方式只要點擊了這個button,就會自動跳轉,不須要寫任何代碼xcode
直接從controller到controller
這種拉線是直接從View Controller到View Controller:
這種方式已經預先建立了segue,可是還須要手工編碼,首先須要給segue設置一個identity
而後寫代碼來跳轉:
- // 跳轉到bootstrap
- - (void) jumpToBootstrap{
- [self performSegueWithIdentifier:@"fromWelcomeToBootstrap" sender:self];
- }
這段代碼必須寫在-viewDidAppear裏,不能寫在-viewDidLoad裏,不然會報一個錯誤:whose view is not in window hierarchy!
頁面之間傳值
之前用-presentModalViewController:animated:方法來跳轉的時候,通常須要經過delegate等方式來傳值,如今一概用segue API就能搞定
在segue發生以前,先會調用當前View Controller的-prepareForSegue:sender:方法,能夠在裏面作一些處理,好比:
- BootstrapViewController* targetController = [segue destinationViewController];// 拿到目標view controller,而後要怎麼樣均可以了
不過這裏要注意的是,彷佛不能在prepareForSegue方法裏設置destination view controller的view,由於這個時候view尚未被storyboard實例化。不過能夠先傳參,後面再設置
另外網上看到不少帖子,都說從B回到A的時候若是也須要傳值,能夠把A設置成B的delegate:
- BViewController.delegate = self;
這裏我不是很理解,當從B回到A的時候,也設置一個segue彷佛就好了
unwind segue
unwind segue比較特殊,是在目標View Controller裏先設置一個action,而後在source View Controller裏拖線到exit圖標上。這種狀況下,除了會調用source的prepareForSegue方法之外,target View Controller的那個action也會被調用。