3.視圖控制器協(xié)同工作創(chuàng)建app界面
視圖控制器管理著它們的視圖及其相關的對象,但是它們也配和其他的視圖控制器提供平滑的用戶界面。app中視圖控制器之間的工作分配和通訊是至關重要的部分。因為這些關聯(lián)關系對于創(chuàng)建復雜的app是非常重要的,下面這部分中我們詳細討論這些內容。
父子關系
一個視圖控制器層級始于一個父類,即窗口的根視圖控制器。如果這個視圖控制器是一個容器,那容器可能擁有提供內容的子視圖控制器。這些控制器,按順序,可能也會是擁有自己子視圖控制器的容器類型。圖1-11就是一個視圖控制器層級的例子。根視圖控制器是一個有四個選項卡的選項欄視圖控制器,第一個選項卡使用了有子控制器的導航視圖控制器,其余三個選項卡被沒有子控制器的內容視圖控制器管理。

視圖控制器的界面可填充區(qū)域受父控制器決定,根視圖控制器的填充區(qū)域決定于window。圖1-11中,選項欄視圖控制器從window獲取它的尺寸,其又準備空間給它的選項卡欄,然后將剩余空間給子視圖控制控。如果導航控制器正在控制顯示,它要給其導航欄準備空間,然后分配剩余的空間給它的內容控制器。每一步操作中,子視圖控制器的視圖都會被父控制器縮放,并且被放置近父控制器的視圖層級。
這種組合視圖和視圖控制器也建立了應用程序事件處理響應鏈。
同級關系
定義被子控制器共享關聯(lián)關系的這類容器控制器,例如,我們比較下選項欄視圖控制器和導航控制器。
1)選項欄視圖容器中,選項欄代表內容區(qū)域,選項工具欄并沒有在子控制器中定義關聯(lián)關系,盡管我們的app可以選擇這樣做;
2)導航控制器中,同級視圖顯示了在被安排在一個堆棧中相關的視圖元素,同級視圖通常共享一個鏈接與毗鄰的同級視圖。
圖1-12顯示了一個視圖控制器和相關的導航控制器的一般配置。第一個子控制器master顯示了除了詳細內容的其他可用內容,當列表項被選中時,其推出一個同級的控制器在導航控制器之上,所以用戶可以看到詳細內容。類似的,如果用戶想看到更多的詳細內容,這同級關系可以推動另一個視圖控制器顯示更多的詳細的內容,當同級視圖有一個定義良好的關系。同級關系經常直接或通過容器控制器相互協(xié)調。如圖1-15所示。

模態(tài)關系
當A視圖控制器想要執(zhí)行一項任務時也會推出B視圖控制器。A視圖控制器負責推出B的這個行為,A配置了B視圖控制器,并且獲取信息從B視圖控制器,最終銷毀B。但是,雖然B視圖控制器是被推出的,B視圖控制器也會臨時的被添加到窗口的視圖層級內。

當一個視圖控制器被推出后,它所占據的屏幕的區(qū)域是被一個稱為顯示上下文的視圖控制器決定的。提供顯示上下文的視圖控制器并不需要有和被推出視圖控制器一樣的控制器。圖1-14顯示了一個和圖1-13中被推出的視圖控制器一樣的視圖控制層級。我們可以看Content視圖控制器推出了Modal視圖控制器,但是并沒有提供顯示上下文。相反,Content視圖控制器是被Tab視圖控制器推出的,因為這一點,盡管內容視圖控制器僅覆蓋選項卡視圖控制器屏幕的一部分,但是Model視圖控制器占據了選項卡視圖控制器屏幕的全部。

內容控制器之間的控制流
多個視圖控制器的app中,app的生命周期內需要經常創(chuàng)建或銷毀視圖控制器。視圖控制器之間的相互通訊保證了良好的用戶體驗,這些關聯(lián)關系代表了app中控制流。
絕大多數的,當一個是新的視圖控制器初始化完成后會產生控制流?;谝晥D控制器的內容的操作會初始化另一個視圖控制器,第一個視圖控制器作為源視圖控制器指揮著第二個視圖控制器,即目標視圖控制器。如果目標視圖控制器需要顯示數據給用戶,通常是源視圖控制器提供數據源。類似的,如果源視圖控制器需要從目標視圖控制器獲取信息,目標視圖控制器負有建立連接的責任在它們兩者之間。
圖1-15顯示了一個最普通的關聯(lián)關系
1)導航視圖控制器的一個子控制器從導航控制器堆棧上推出了另外一個子控制器;
2)一個視圖控制器提供另一個視圖控制器;
3)一個視圖控制器在彈窗中顯示另一個視圖控制器。

每個視圖控制器都是被處理它的視圖控制配置,當多個視圖控制器一起工作,它們建立了一個通訊鏈。
目標視圖控制器定義了每個鏈接之間的控制流,源視圖控制器使用這個約定好的控制流。
1)目標視圖控制器提供了用于配置屬性數據和顯示規(guī)則;
2)如果目標視圖控制器需要和在通訊鏈中提供處理的視圖控制器通訊,可以使用委托。如果源視圖控制器需配置目標視圖控制器的其他屬性,源視圖控制器同樣也期望提供一個實現了委托協(xié)議的對象。
使用控制流約定的優(yōu)點是可以在每對源控制器和目標控制器之間分工明確,當源視圖控制器要求目標視圖控制器執(zhí)行一項任務時數據流需要沿著路徑向下傳遞,目標視圖控制器驅動著這個過程。例如,目標視圖控制器可能需要顯示一些特定的數據來自于源視圖控制器。從另一個方向來講,當是一個視圖控制器需要提交數據到源視圖控制器是數據流需要沿著路徑向上傳遞。例如,任務執(zhí)行完畢需要通訊。
同時,通過一致的實現這種控制流模型,可以確保目標視圖控制器從不會知曉太多關于配置它們的源視圖控制器.當目標視圖控制器知道通訊鏈中上流的的視圖控制器,就明白只有類實現委托協(xié)議。通過保持視圖控制器互相了解太多,提高了單獨的控制器的復用性。別人閱讀你的代碼,一個實現一致的控制流模型在任何一對控制器之間的通信路徑都很容易一清二楚。