UIKit-UIViewController

一、結構

按結構可以對iOS的所有ViewController分成兩類:

1、主要用于展示內容的ViewController,這種ViewController主要用于為用戶展示內容,并與用戶交互,如UITableViewController,UIViewController。

2、用于控制和顯示其他ViewController的ViewController。這種ViewController一般都是一個ViewController的容器。如UINavigationController,UITabbarController。它們都有一個屬性:viewControllers。其中UINavigationController表示一種Stack式結構,push一個ViewController或pop一次,因此后一個ViewController一般會依賴前一個ViewController。而UITabbarController表示一個Array結構,各個ViewController是并列的。

第一種ViewController會經常被繼承,用來顯示不同的數據給用戶。而第二種很少被繼承,除非你真的需要自定義它。

注:細心的同學應該能發現,在Xcode中新建一個ViewController時,只可以選擇繼承自UIViewController和UITableViewController,而它們都是第一種。

二、Controller和View的生命周期

這里指的View是指Controller的View。它作為Controler的屬性,生命周期在Controller的生命周期內。就是說你的Controller不能在view釋放前就釋放了。



當你alloc并init了一個ViewController時,這個ViewController應該是還沒有創建view的。ViewController的view是使用了lazyInit方式創建,就是說你調用的view屬性的getter:[self view]。在getter里會先判斷view是否創建,如果沒有創建,那么會調用loadView來創建view。loadView完成時會繼續調用viewDidLoad。loadView和viewDidLoad的一個區別就是:loadView時還沒有view。而viewDidLoad時view以及創建好了。

當view被添加其他view中之前時,會調用viewWillAppear,而之后會調用viewDidAppear。

當view從其他view中移出之前時,會調用viewWillDisAppear,而之后會調用viewDidDisappear。

當view不在使用,而且是disappeared,受到內存警告時,那么viewController會將view釋放并將其指向nil。

三、代碼組織(如何設計良好的viewcontroller)

ViewController生命周期中有那么多函數,一個重要問題就是什么代碼該寫在什么地方。

1、init里不要出現創建view的代碼。良好的設計,在init里應該只有相關數據的初始化,而且這些數據都是比較關鍵的數據。init里不要掉self.view,否則會導致viewcontroller創建view。(因為view是lazyinit的)。

2、loadView中只初始化view,一般用于創建比較關鍵的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非關鍵的view。如果你是從nib文件中創建的viewController在這里一定要首先調用super的loadView方法,但建議不要重載這個方法。

調用:每次訪問UIViewController的view(比如controller.view、self.view)而且view為nil,loadView方法就會被調用。

3、viewDidLoad 這時候view已經有了,最適合創建一些附加的view和控件了。有一點需要注意的是,viewDidLoad會調用多次(viewcontroller可能多次載入view,參見圖2)。

4、viewWillAppear 這個一般在view被添加到superview之前,切換動畫之前調用。在這里可以進行一些顯示前的處理。比如鍵盤彈出,一些特殊的過程動畫(比如狀態條和navigationbar顏色)。

5、viewDidAppear 一般用于顯示后,在切換動畫后,如果有需要的操作,可以在這里加入相關代碼。

6、viewDidUnload 這時候viewController的view已經是nil了。由于這一般發生在內存警告時,所以在這里你應該將那些不在顯示的view釋放了。比如你在viewcontroller的view上加了一個label,而且這個label是viewcontroller的屬性,那么你要把這個屬性設置成nil,以免占用不必要的內存,而這個label在viewDidLoad時會重新創建。


self.automaticallyAdjustsScrollViewInsets = NO;

此屬性默認為YES,這樣UIViewController下如果只有一個UIScollView或者其子類,那么會自動留出空白,讓scollview滾動經過各種bar下面時能隱約看到內容。但是每個UIViewController只能有唯一一個UIScollView或者其子類,如果超過一個,需要將此屬性設置為NO,自己去控制留白以及坐標問題。


http://blog.csdn.net/q199109106q/article/details/8614044

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 1,862評論 0 2
  • 27、ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是...
    煙雨平生花飛舞閱讀 623評論 0 1
  • 7、不使用IB是,下面這樣做有什么問題? 6、請說說Layer和View的關系,以及你是如何使用它們的。 1.首先...
    AlanGe閱讀 720評論 0 1
  • 最近看了幾篇博客,在這里對ViewConroller的生命周期做一個總結,抽絲剝繭吧,感覺有道理的拿出來匯總一下 ...
    公子無禮閱讀 1,485評論 0 2
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,217評論 30 472