在談到storyboard時,咱們屢次強調, storyboard 解決的是頁面之間的跳轉問題。 一個頗爲複雜的頁面跳轉,一旦使用了storyboard,就會四兩撥千斤。你只需簡單地拖拽,便可完成UIViewController 之間的跳轉。 這裏面有個神器,一個極爲重要的method,它就是: prepareForSegue:sender:code
從method 簡略的表達式,一眼就可看出, 它有2個參數 (arguments)。爲何說呢,由於他有2個冒號嘛。 其實,這個method 的完整表達式爲: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)senderblog
第一個參數是 segue, 第二個參數是 sender。io
這裏給出一段代碼實例,展現了這個method 的經常使用方法。 這段code 寫在當前的ViewController 對應的.m 文件中。table
這個method 主要解決2個問題:class
(1) 獲取所要跳轉到的視圖控制器 (ViewController);object
(2) 同時,將上一個視圖的數據,傳遞給下一個視圖。 (好比: 上一個視圖是TableView, 那麼,就要將點擊cell的行號傳遞到下一個視圖)。select
UIViewController *destination = segue.destinationViewController; 只要是 prepareForSegue:sender: 總會聲明一個目標視圖控制器(destination viewcontroller);方法
獲取到下一個視圖控制器後, 能夠跳轉過去了。但僅僅跳轉還不夠,總得將數據傳遞過去吧。 好比上一個視圖是TableView,當用戶點擊某個Cell 進入下個頁面時,就得將所點擊的cell 行號傳遞給下個頁面。技術
有一種靈活的傳遞方法,經過遵循 KVC (Key -Value- Coding)規則來傳值。 具體來講, 就是經過 [viewController setValue: forKey: ] 來存儲數據。 既然提供了存儲方式,就有對應的獲取的方式。 以技術用語表達,就是: 讀寫操做是成對出現的。有賣,就有買。呵 拖拽
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIViewController *destination = segue.destinationViewController; if ([destination respondsToSelector:@selector(setDelegate:)]) { [destination setValue:self forKey:@"delegate"]; } if ([destination respondsToSelector:@selector(setSelection:)]) { // prepare selection info NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; id object = self.tasks[indexPath.row]; NSDictionary *selection = @{@"indexPath" : indexPath, @"object" : object}; [destination setValue:selection forKey:@"selection"]; } }
前面寫的都是鋪墊,接下來,咱們重點談下 prepareForSegue:sender: 的使用。 該方法的觸發條件是:
當前的視圖控制器即將被另外一個視圖控制器所替代時,segue將處於激活狀態,從而調用prepareForSegue:sender: 方法。
具體對於TableView來講,當某個cell 被點擊時,該cell所對應的segue將被激活,同時,這個method將被調用。咱們最關心的數據傳遞問題, 就是利用這個時機完成的。
在stroyboard技術出現以前, 數據的傳遞將經過 tableview delegate 來實現,多少有些麻煩吧。 你能夠看到,用storyboard技術,技術這麼簡單。 固然,你也能夠經過button的點擊,進入下一個頁面。 無論怎樣,經過segue就能很輕鬆地實現視圖的跳轉。
回過頭來,咱們再來仔細看看這個prepareForSegue:sender: 這個神奇的方法。
爲了區分視圖的跳轉,能夠用上一個、下一個來表示,也能夠用源視圖、目標視圖來表示。 即: sourceViewController 和destinationViewController。 目標視圖控制器是指:即將顯示(加載)的視圖, 而源視圖控制器是指:即將被取代的視圖控制器。
寫到這裏,感受有點偷懶。 segue雖然實現的是視圖之間的跳轉,實際上是視圖控制器之間的切換。 更確切地說,segue 實現的是Secene(場景)之間的跳轉。