標籤:code ext c 檔案 使用 a
在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來提供顯示多頁時使用,如果你的應用中有這種固定模式,你可以提供一個給整個應用來用。