http://leopard168.blog.163.com/blog/static/16847184420142735531836)
在談到storyboard時玲躯,我們多次強調(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熊痴, 那么,就要將點擊cell的行號傳遞到下一個視圖)聂宾。
UIViewController *destination = segue.destinationViewController;
只要是 prepareForSegue:sender: 總會聲明一個目標(biāo)視圖控制器(destination viewcontroller)果善;
獲取到下一個視圖控制器后, 可以跳轉(zhuǎn)過去了系谐。但僅僅跳轉(zhuǎn)還不夠巾陕,總得將數(shù)據(jù)傳遞過去吧。 比如上一個視圖是TableView纪他,當(dāng)用戶點擊某個Cell 進(jì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"];
}
}
前面寫的都是鋪墊,接下來,我們重點談下 prepareForSegue:sender: 的使用供璧。 該方法的觸發(fā)條件是:
當(dāng)前的視圖控制器即將被另一個視圖控制器所替代時存崖,segue將處于激活狀態(tài),從而調(diào)用
prepareForSegue:sender: 方法睡毒。
具體對于TableView來說来惧,當(dāng)某個cell 被點擊時,該cell所對應(yīng)的segue將被激活演顾,同時供搀,這個method將被調(diào)用。我們最關(guān)心的數(shù)據(jù)傳遞問題钠至, 就是利用這個時機完成的葛虐。
在stroyboard技術(shù)出現(xiàn)之前, 數(shù)據(jù)的傳遞將通過 tableview delegate 來實現(xiàn)棉钧,多少有些麻煩吧屿脐。 你可以看到,用storyboard技術(shù)宪卿,技術(shù)這么簡單的诵。 當(dāng)然,你也可以通過button的點擊佑钾,進(jìn)入下一個頁面西疤。 不管怎樣,通過segue就能很輕松地實現(xiàn)視圖的跳轉(zhuǎn)次绘。
回過頭來瘪阁,我們再來仔細(xì)看看這個prepareForSegue:sender: 這個神奇的方法撒遣。
為了區(qū)分視圖的跳轉(zhuǎn)邮偎,可以用上一個、下一個來表示义黎,也可以用源視圖禾进、目標(biāo)視圖來表示。 即: sourceViewController 和destinationViewController廉涕。 目標(biāo)視圖控制器是指:即將顯示(加載)的視圖泻云, 而源視圖控制器是指:即將被取代的視圖控制器。
寫到這里狐蜕,感覺有點偷懶宠纯。 segue雖然實現(xiàn)的是視圖之間的跳轉(zhuǎn),其實是視圖控制器之間的切換层释。 更確切地說婆瓜,segue 實現(xiàn)的是Secene(場景)之間的跳轉(zhuǎn)。
Scene 是由: View 、 ViewController廉白、First Responder个初、Exit 組成的。