對比學習UIKit和AppKit -- ViewController


在iOS中ViewController的基類是UIViewController;Mac中ViewController的基類是NSViewController。

Mac中ViewController父類是NSViewController,子類很少,筆者就查到了NSPageController。如果應用中需要,可以Customize。

iOS中有好多個ViewController,在Ref2中有介紹,其父類是UIViewController,子類包括UINavigationController、UITabBarController、UIPageViewController等。也可以Customize。

在應用中如何使用ViewController呢?還有Window、WindowController之間都是什么關系呢? 下面先說說流水賬。

1. 在Mac上創建一個Window,我們需要指定這個Window的File‘s Owner,這個File’s Owner需要是一個WindowController的子類;而iOS上不會創建一個Window,也不需要WindowController,因為iOS上的Window非常簡單,它不需要title bars, close boxes, or any other visual adornments;

2. 不論在iOS上還是Mac上,如果我們需要在xib文件中創建一個view時,需要指定這個View的File‘s Owner,這個File’s Owner需要是一個ViewController的子類;或者時UIViewController或者時NSViewController;

3. 在Mac上,創建一個view 的xib文件后,會有一個Application的Placeholder對象出現在IB中,如同其所在的category說的一樣,它是一個Placeholder,<TBD>;

4. 在Mac上創建一個Window的xib文件后,跟創建view時不一樣的地方在於,Window的xib中有一個欄目時Object,和PlaceHolder時並列的,Mac和iOS上創建View的xib文件時就沒有,這個源於Window與view的不同。先看Xcode給默認加入的三個對象:Main Menu、App Delegate和Font Manager。這個話題需要另開新帖。<TBD>;

5. 在Mac和iOS上開發的不同在於,Mac上偏重Window,View次之,而iOS上可以說時99%是View。比如我們要顯示一個Image+一段文字描述,在Mac上通常可以在一個Window上拉進兩個View,一個ImageView,一個TextField view,然后由WindowController來處理,當然也可以創建一個customized 的view,這個view包括一個ImageView,一個TextField view,然后配上一個custom view controller;而iOS上搞一個root view,然后像Mac上那樣搞也可以,但是如果一個應用的頁面多了,管理起來就麻煩了,一個頁面顯示Image,另外一個頁面就是tab view了,難道把之前的全刪掉,然后加新的,或者新搞一個window,然后替換當前的window?都不太自然,即使能實現,成本也高了很多。所以最好的方式就是創建一個自定義的view,然后加一個custom viewcontroller。

6. ViewController干了什么,什么情況下需要customize view controller? view controller是UI設計MVC模式中的C,對於iOS上的UIViewcontroller,我寫過一篇博文,沒深入挖掘什么,就是讀了一下Apple的文檔,亂寫的,概括來說,有這么幾個功能:View Management,rotation management等。而Mac上的NSViewController最主要的就是view management。顯著的區別就是iOS需要管理view的什么周期,並把若干callback函數暴露出來,讓developer來定制在什么時候干什么事,比如在ViewWillAppear中可以設置status bar的方向和樣式以使status bar和要顯示的view風格一致等等。什么時候需要customized viewcontroller?這個對於Mac和iOS是通用的,如果定制了View,就需要定制的viewcontroller,因為view controller需要管理這個view,對這個view中每個button如何顯示,點擊后反應是什么,awakeFromnib怎樣實現都得提供支持。

7. 問題回到最初,為什么iOS上有那么多UIViewController的子類,而Mac上卻少有NSViewController的子類呢?iOS上view的顯示空間小,要高效地顯示往往總要采取那幾種方式,Apple提取了若干種非常常用的view,對其提供了UIViewController的子類幫助開發者直接使用,從而縮短開發時間。而Mac上有足夠的空間,開發者可以隨便搞,很難抽取共同的模式,即便少,但還是有NSPageController來提供顯示多頁時使用,如果你的應用中有這種固定模式,你可以提供一個給整個應用來用。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM