<轉(zhuǎn)>storyboard之 prepareForSegue:sender:

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 組成的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容