1.視圖控制器的分類
圖1-5描述了UIKit框架中可用的視圖控制器類及其相關的一些重要的其他類。例如周霉,選項欄視圖控制器UITabBarController對象管理著一個UITabBar選項欄對象,這個選項對象顯示和選項欄接口相關的選項卡,其他框架定義額外的視圖控制器類中沒有顯示在此圖中这橙。
視圖控制器,包括iOS提供的和自定義的导披,都可以被分為兩種普通類型——內容視圖控制器和容器視圖控制器屈扎,這反映了視圖控制器在app中充當?shù)慕巧?/p>
1.1 內容視圖控制器顯示內容
視圖控制器使用一個視圖或者一組以視圖層級結構存在的視圖顯示內容在屏幕。目前為止討論的控制器都是內容視圖控制器盛卡。一個視圖控制器通常知曉和其角色相關的部分app數(shù)據(jù)助隧。
以下是一些需要使用到內容視圖控制器的例子:
1)顯示數(shù)據(jù)給用戶;
2)收集數(shù)據(jù)從用戶滑沧;
3)執(zhí)行一項指定任務并村;
4)在一組可用的命令或者選中的導航,例如一個游戲的啟動畫面滓技。
內容視圖控制器是app主要協(xié)調對象哩牍,因為他們知道數(shù)據(jù)的具體細節(jié)和提供給用戶的任務。
我們創(chuàng)建的每個內容視圖控制器都負有管理所有的單一視圖層級內的視圖的責任令漂。視圖控制器和視圖之間的一一對應的視圖層次是設計考慮的關鍵膝昆。我們不應該用多個內容視圖控制器管理同一個視圖層級。相似的叠必,不能用一個內容視圖控制器管理多個屏幕內容荚孵。
表格視圖控制器
對于有表格顯示需求的app,iOS已經(jīng)內建了一個專門的表格視圖控制器來管理表格數(shù)據(jù)纬朝。這個UITableViewController類收叶,管理著表格視圖和大多數(shù)與表格相關的如選中、行編輯及表格配置的操作支持共苛。這些額外的支持可以讓我們用最少的代碼快速初始化一個表格出來判没。并且我們也可以實現(xiàn)自己的表格控制器子類從而可以添加其他的自定義行為蜓萄。
圖1-6是一個使用表格視圖控制器的例子。由于表格視圖控制器是視圖控制器的子類澄峰,表格視圖控制器仍然有一個指向根視圖界面的指針嫉沽,但其也有一個分開的指向顯示在根視圖中的表格的指針。
1.2 內容視圖控制排列其他視圖控制器的內容
一個內容視圖控制器包含其他視圖控制器擁有的內容俏竞。這些視圖控制器被顯式地分配容器視圖控制器作為它們的子內容绸硕。一個容器控制器即可以作為父視圖也可以作為子內容。最終胞此,這種結構的控制器形成了一個視圖控制器層級臣咖。
每種類型的容器視圖控制器都創(chuàng)建了一個其子視圖在內操作的用戶界面跃捣。這個用戶界面的視覺呈現(xiàn)和設計在不同容器視圖控制器具有很大的差異性漱牵。例如,這里有一些不同容器視圖控制器用于區(qū)別彼此的方式:
1)容器會提供自己的API去管理子視圖疚漆;
2)容器決定了子視圖之間的關系和關系類型酣胀;
3)容器管理著類似視圖控制器的視圖層級,容器也可以添加子視圖控制器的視圖到它的視圖層級中娶聘。容器決定了何時添加視圖和如何適配視圖層級的視圖尺寸闻镶,但是在其他情況下子視圖控制器仍然負責管理它的視圖和子視圖。
4)一個容器可能要特別考量設計在它的子內容上丸升。例如,容器可能會限制其子內容對一些視圖控制器類,或者它可能期望這些控制器提供額外的內容需要配置容器的視圖铆农。
內建的容器類的用戶界面已經(jīng)被組織好了,我們可以通過這些容器類管理的用戶界面構建我更復雜的應用狡耻。
導航控制器
導航控制器代表被按照等級關系組織的數(shù)據(jù)墩剖,并且它是UINavigationController類的實例。這個類提供的方法支持以堆棧的方式管理內容集合視圖控制器夷狰。這個堆棧代表用戶訪問層級數(shù)據(jù)的路徑岭皂,堆棧底反應了用戶訪問的起點,堆棧頂反應了用戶當前的位置沼头。
圖1-7顯示了通訊錄中的屏幕爷绘,通訊錄使用了導航控制器顯示通訊錄信息給用戶。每個界面頂部的導航欄都屬于導航控制器进倍,其余的顯示給用戶的內容受管于內容視圖控制器土至。當用戶在界面中和這些控制器做交互,這些控制器告訴導航控制器根據(jù)順序顯示下一個視圖控制器或者隱藏當前視圖控制器猾昆。
雖然一個導航控制器的主要工作是管理它的子視圖控制器陶因,但是也管理一些視圖。特別的毡庆,它管理一個導航欄(顯示用戶當前位置信息在數(shù)據(jù)層級中)坑赡,一個按鈕(用戶返回之前屏幕)烙如,或者其他當前視圖控制器需要的自定義控制器。我們不能直接修改視圖控制器的視圖毅否,相反亚铁,我們可以通過設置每個子視圖控制器的屬性配置導航控制器顯示的控制器。
選項欄控制器
使用選項欄控制器可以把app分割成兩個或更多個操作區(qū)域螟加。選型欄控制器是UITabBarController 的實例徘溢。選項欄可以有多個選項卡,每個都相當于一個子視圖控制器捆探。選中一個選項卡會使選項欄控制器顯示和選項卡相關的視圖控制器的內容在屏幕上然爆。
圖1-8顯示了幾個時鐘應用的不同模式和它們的視圖控制器之間的對應關系。每個模式有一個內容視圖控制器管理著主內容區(qū)域黍图。在時鐘應用這種情況下曾雕,時鐘和鬧鐘視圖控制器兩個都顯示一個導航形式的接口以適應一些附加的控制在屏幕頂端。其他模式使用內容視圖控制器呈現(xiàn)一個單一的屏幕助被。
使用選項欄控制器當我們的app需要呈現(xiàn)不同類型的數(shù)據(jù)或者用不同的方式呈現(xiàn)相同的數(shù)據(jù)剖张。
分屏視圖控制器
分屏視圖控制器將屏幕分割成多個部分,每個都可以獨自更新揩环。這種分屏的顯示很依賴設備顯示的重力方向搔弄。分屏視圖控制器是UISplitViewController的實例。分屏視圖的界面內容來自兩個視圖控制器丰滑。
圖1-9顯示的是一個分屏的視圖界面顾犹。豎屏模式下,只顯示詳情視圖褒墨,列表視圖在彈出窗口中顯示炫刷。但是,橫屏模式下貌亭,分屏控制器在兩側都顯示各自的內容柬唯。
彈窗控制器
同樣在圖1-9中,在豎屏模式下圃庭,主視圖顯示在一個彈窗中锄奢。在iPad應用中,可以使用彈窗控制器實現(xiàn)彈窗在我們自己的應用中剧腻。
彈窗控制器并不是一個容器拘央,它沒有繼承自UIViewController。但是书在,在實際應用中灰伟,彈窗控制器類似于容器,所以使用它時適用于同樣的編程原則。
分頁視圖控制器
分頁視圖控制器是用來實現(xiàn)分頁布局的視圖容器栏账。這種布局允許用戶在類似書本的分開的內容頁面之間翻動帖族。分頁視圖控制器是UIPageViewController的實例。內容視圖控制器提供內容頁挡爵。分頁視圖控制器管理著頁面之間的過渡竖般。當需要翻頁時,分頁視圖控制器調用相關的數(shù)據(jù)獲取新頁面的視圖控制器茶鹃。
2.視圖控制器的內容可以有多種方式顯示
顯示給用戶的視圖控制器的內容涣雕,必須是和window關聯(lián)起來的,這里可以有多種實現(xiàn)方式闭翩。
1)視圖控制器作為根視圖控制器挣郭;
2)視圖控制器作為容器的子內容;
3)在彈出窗中顯示視圖控制器疗韵;
4)從其他視圖控制器推出兑障。
圖1-10是一個通訊錄的例子。當用戶單擊添加按鈕添加一條新的通訊錄時伶棒,通訊錄視圖控制器推出了添加通訊錄的視圖控制器旺垒。這個視圖控制器一直保持可見直到用戶取消操作或者輸入了完整的信息后保存通訊內容到數(shù)據(jù)庫彩库。如此肤无,通訊信息被傳送到了通訊錄視圖控制器,剛才的添加通訊錄的視圖控制器就可以退場了骇钦。
這個被推出的視圖控制器并沒有指定其類型--既可以是內容視圖控制器宛渐,也可以是容器視圖控制器,都附加了內容視圖控制器在其上眯搭。在實際中窥翩,內容視圖控制器被設計成被另一視圖控制器推出,因此作為一個變化的內容視圖控制器可能是非常有意義的鳞仙。
很多情況下寇蚊,我們推出的視圖控制器為了達到一些目的去收集用戶信息或者吸引用戶注意,一旦這些目的達成棍好,當前的被推出視圖控制器就要退場仗岸,app要返回到標準的用戶界面。
被推出的視圖控制器本身并不能代表其他的視圖控制器借笙。當我們想執(zhí)行幾個獨立的模型動作時扒怖,鏈接在一起的視圖控制器鏈是非常有用的。例如业稼,圖1-10中用戶在添加新通訊錄界面中單擊添加相片按鈕想選擇已經(jīng)存在的相片盗痒,這個新通訊錄視圖控制器就要推出一個選取相片的界面。用戶要返回到通訊錄列表視圖就需要先退出選取相片界面低散,然后再退出新通訊錄界面俯邓。
當推出一個視圖控制器骡楼,就有一個視圖控制器決定了其占據(jù)屏幕內容的多少,部分屏幕被默認地稱為顯示上下文環(huán)境稽鞭,顯示上下文環(huán)境被用來覆蓋窗口君编。