http://leopard168.blog.163.com/blog/static/16847184420142735531836)
在談到storyboard時,我們多次強(qiáng)調(diào), storyboard 解決的是頁面之間的跳轉(zhuǎn)問題。 一個頗為復(fù)雜的頁面跳轉(zhuǎn),一旦使用了storyboard,就會四兩撥千斤。你只需簡單地拖拽,即可完成UIViewController 之間的跳轉(zhuǎn)。 這里面有個神器,一個極為重要的method,它就是: prepareForSegue:sender:
從method 簡略的表達(dá)式,一眼就可看出, 它有2個參數(shù) (arguments)。為什么說呢,因為他有2個冒號嘛。 其實,這個method 的完整表達(dá)式為:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
第一個參數(shù)是 segue, 第二個參數(shù)是 sender。
這里給出一段代碼實例,展示了這個method 的常用方法。 這段code 寫在當(dāng)前的ViewController 對應(yīng)的.m 文件中。
這個method 主要解決2個問題:
(1) 獲取所要跳轉(zhuǎn)到的視圖控制器 (ViewController);
(2) 同時,將上一個視圖的數(shù)據(jù),傳遞給下一個視圖。 (比如: 上一個視圖是TableView, 那么,就要將點(diǎn)擊cell的行號傳遞到下一個視圖)。
UIViewController *destination = segue.destinationViewController;
只要是 prepareForSegue:sender: 總會聲明一個目標(biāo)視圖控制器(destination viewcontroller);
獲取到下一個視圖控制器后, 可以跳轉(zhuǎn)過去了。但僅僅跳轉(zhuǎn)還不夠,總得將數(shù)據(jù)傳遞過去吧。 比如上一個視圖是TableView,當(dāng)用戶點(diǎn)擊某個Cell 進(jìn)入下個頁面時,就得將所點(diǎn)擊的cell 行號傳遞給下個頁面。
有一種靈活的傳遞方法,通過遵循 KVC (Key -Value- Coding)規(guī)則來傳值。 具體來說, 就是通過 [viewController setValue: forKey: ] 來存儲數(shù)據(jù)。 既然提供了存儲方式,就有對應(yīng)的獲取的方式。 以技術(shù)用語表達(dá),就是: 讀寫操作是成對出現(xiàn)的。有賣,就有買。呵
- (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"];
}
}
前面寫的都是鋪墊,接下來,我們重點(diǎn)談下 prepareForSegue:sender: 的使用。 該方法的觸發(fā)條件是:
當(dāng)前的視圖控制器即將被另一個視圖控制器所替代時,segue將處于激活狀態(tài),從而調(diào)用
prepareForSegue:sender: 方法。
具體對于TableView來說,當(dāng)某個cell 被點(diǎn)擊時,該cell所對應(yīng)的segue將被激活,同時,這個method將被調(diào)用。我們最關(guān)心的數(shù)據(jù)傳遞問題, 就是利用這個時機(jī)完成的。
在stroyboard技術(shù)出現(xiàn)之前, 數(shù)據(jù)的傳遞將通過 tableview delegate 來實現(xiàn),多少有些麻煩吧。 你可以看到,用storyboard技術(shù),技術(shù)這么簡單。 當(dāng)然,你也可以通過button的點(diǎn)擊,進(jìn)入下一個頁面。 不管怎樣,通過segue就能很輕松地實現(xiàn)視圖的跳轉(zhuǎn)。
回過頭來,我們再來仔細(xì)看看這個prepareForSegue:sender: 這個神奇的方法。
為了區(qū)分視圖的跳轉(zhuǎn),可以用上一個、下一個來表示,也可以用源視圖、目標(biāo)視圖來表示。 即: sourceViewController 和destinationViewController。 目標(biāo)視圖控制器是指:即將顯示(加載)的視圖, 而源視圖控制器是指:即將被取代的視圖控制器。
寫到這里,感覺有點(diǎn)偷懶。 segue雖然實現(xiàn)的是視圖之間的跳轉(zhuǎn),其實是視圖控制器之間的切換。 更確切地說,segue 實現(xiàn)的是Secene(場景)之間的跳轉(zhuǎn)。
Scene 是由: View 、 ViewController、First Responder、Exit 組成的。