第七堂:NavigationController以及TabBarController
上次的筆記中我們提到了View Controller的基礎(chǔ),以及如何建立自己的View Controller。在這一次的課程內(nèi)容中,我們將學(xué)習(xí)到如何使用UIKit所提供的View Controllers來(lái)幫助我們建立程式的導(dǎo)覽。
第七次的課堂中,主要涵蓋了一下幾個(gè)主題:
Navigation Controller
在上一次的iPhone開(kāi)發(fā)課程筆記中我們談到了View Controller的建立方法以及概念,概括而言,View Controller在iPhone程式當(dāng)中扮演著主幹的角色,負(fù)責(zé)銜接View和Model。
而在上回筆記中的後段,我們也曾經(jīng)談過(guò)我們可以透過(guò)UIKit中所提供的View Controller來(lái)銜結(jié)我們自己的View Controller,建立出整個(gè)程式的動(dòng)線。而Navigation Controller就是常用的一種。很多iPhone的程式中都有Navigation Controller,像是當(dāng)我們?cè)趯]嬃斜碇羞x擇了某一張專輯,隨集會(huì)從螢?zāi)蛔筮厧敫枨牧斜?#xff0c;我們也可以點(diǎn)左上角的返回按鈕回到專輯列表,這樣的導(dǎo) 覽模式就是Navigation Controller。
而Navigation Controller的畫(huà)面就如下所示,在中間顯示了目前在Stack最上端的Controller的View,在上面則是這個(gè)Controller的title,左上角的上一頁(yè)按鈕則是前一個(gè)Controller的title。
就實(shí)做上來(lái)說(shuō),Navigation Controller下面包含了許多需要顯示的View Controllers,用Stack的方式集合在一起。當(dāng)我們需要換頁(yè)的時(shí)候,我們只需要push一個(gè)View Controller進(jìn)去,而需要回到上一頁(yè)則是透過(guò)pop一個(gè)View Controller來(lái)達(dá)成。
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; // 換到新的Controller - (UIViewController *)popViewControllerAnimated:(BOOL)animated; // 回到上一個(gè)Controller - (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated; // 整組換掉,在iPhone OS 3.0後加入上面這幾個(gè)方法中,(BOOL)animated這個(gè)參數(shù)決定了換頁(yè)時(shí)是否會(huì)有動(dòng)畫(huà)的效果。在大多數(shù)的情況下,我們當(dāng)然想要顯示換頁(yè)的效果,但是當(dāng)程式剛啟動(dòng)、初始化時(shí),在加入第一個(gè)VIew Controller的時(shí),我們就不需要?jiǎng)赢?huà)的效果。
值得一提的是,我們一般很少會(huì)直接呼叫pop方法,因?yàn)樵谑褂谜甙聪伦笊辖堑耐嘶匕粹o時(shí)就會(huì)自動(dòng)呼叫這個(gè)方法了。
在投影片的第19頁(yè)和22有分別介紹如何初始化一個(gè)Navigation Controller以及如何加入新的Controller,有興趣的讀者還請(qǐng)參考。比較需要注意的是,當(dāng)我們初始化完 NavigationController之後,要記得把NavigationController的view加入到window的subview中,否 則畫(huà)面上不會(huì)顯示。
Controller間的資料傳遞
在程式的進(jìn)行中,會(huì)有很多Controller被建立或是移除,那我們要怎麼讓這些Controller能夠互相溝通呢?用下圖的例子作為舉例,List Controller包含了所有資料的列表,而Detail Controller則是會(huì)顯示被選取道的資料內(nèi)容。
由List Controller傳遞資料到Detail Controller的方法相當(dāng)簡(jiǎn)單,由於後者的初始化會(huì)由前者進(jìn)行,所以只要定義好初始化的參數(shù)就沒(méi)問(wèn)題了。然而,要從後者傳遞給前者,我們會(huì)使用 Delegate的方式,也就是建立一組protocol,讓List Controller去實(shí)做,當(dāng)Detail Controller需要傳遞訊息時(shí)則呼叫List Controller的對(duì)應(yīng)方法就行了。
自訂導(dǎo)覽列
Navigation Controller所產(chǎn)生的螢?zāi)划?huà)面最上方有條導(dǎo)覽列,包含了標(biāo)題還有一些按鈕,我們可以透過(guò)修改UINavigationItem來(lái)達(dá)成我們想要的效 果。每個(gè)View Controller都包含一個(gè)UINavigationItem,然而只有在Navigation Controller的Stack最上方的才會(huì)被顯示。
如果我們修改標(biāo)題的話,並不需要修改UINavigationItem,因?yàn)閂iew Controller中就有一個(gè)title的property,UINavigationItem會(huì)自動(dòng)繼承這個(gè)property來(lái)顯示。
至於按鈕的部份,UIKit提供了三種不同的按鈕,分別是字串的顯示、圖片的顯示和系統(tǒng)內(nèi)建的按鈕。而這些按鈕就如同一般按鈕一樣,用的是target-action的概念,在投影片的第50到59頁(yè)中有範(fàn)例的程式碼,讀者可以直接複製使用。
此外,我們也可以在原本title的地方顯示一個(gè)View而非單純的字串,只要將self.navigationItem.titleView指定為想要顯示的View即可。
最後,因?yàn)橥嘶匕粹o是直接使用NavigationController中Stack的前一項(xiàng)Controller的title,有時(shí)候會(huì)出現(xiàn)文字過(guò)長(zhǎng)的情形,請(qǐng)參考投影片的第66頁(yè)的作法,另行設(shè)定一個(gè)按鈕替換,就可以解決這個(gè)問(wèn)題了。
Tab bar Controller
談完了NavgationController,我們當(dāng)然也沒(méi)有忘記TabBarController。TabBarController就是我們?cè)诟鱾€(gè)App中看到下方有一排按鈕,每個(gè)按鈕分別會(huì)切換到不同的View Controller。
在投影片78頁(yè)中可以看到,建立TabBarController的作法跟NavigationController相同,一樣要記得加入到window的subviews當(dāng)中,才會(huì)在螢?zāi)簧巷@示。
如同UINavigationItem一樣,每個(gè)View Controller也包含了一個(gè)UITabBarItem物件,由文字及圖案組成,而UIKit也提供了一些系統(tǒng)內(nèi)建的按鈕可以使用。建立按鈕的程式碼 在投影片的第84和87頁(yè),大家還多多參考。要注意的是,除了用程式建立UITabBarItem之外,我們也可以透過(guò)Interface Builder來(lái)建立,相對(duì)是比較容易、簡(jiǎn)單。
結(jié)合兩種形式
最後,我們也可以結(jié)合以上兩種形式,由Tab Bar Controller作為基礎(chǔ),加入Navigation Controller或是其他自訂的View Controller,這樣一來(lái)就形成了一般常見(jiàn)的iPhone應(yīng)用程式架構(gòu)了。
結(jié)論
在這次的課程中,我們學(xué)習(xí)到了兩種導(dǎo)覽用的View Controlles的使用方法。在下一次的內(nèi)容中,我們將看到如何透過(guò)Table View Controller來(lái)顯示大量資料,並且處理捲動(dòng)的效果,還請(qǐng)各位讀者敬請(qǐng)期待!
參考資源
- Lecture #7 – Navigation and Tab Bar Controllers
- View Controller Programming Guide for iPhone OS
- UINavigationController Class Reference
- UITabBarController Class Reference
轉(zhuǎn)載于:https://www.cnblogs.com/WuShuang-/archive/2012/02/28/2371866.html
總結(jié)
以上是生活随笔為你收集整理的第七堂:NavigationController以及TabBarController的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么内联函数,构造函数,静态成员函数不
- 下一篇: 开篇 随笔