loadView方法

UIViewController的loadView

用UIViewController有一段時間了,才發現以前對loadView的理解完全不到位。

假如我們用Xcode新建一個View-based Application,在ViewController.m中加上

- (void) loadView {
NSLog(@"loadView Called");
}

再增加viewDidLoad,按照一般的情況,我們會有這樣的Code

- (void) viewDidLoad {
[super viewDidLoad];
UIButton *customButton = [UIButton buttonWith.....
......
[self.view addSubView:customButton];
}

現在打開MainWindow.xib,刪掉其中的ViewController,并在AppDelegate.m的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

里增加ViewController的初始化

viewController = [[XXXViewController alloc] init];

編譯運行就有問題了。Console中不斷的輸出loadView Called!

仔細的閱讀loadView的文檔,才知道loadView不是這么用的。


loadView在每一次使用self.view這個property,并且self.view為nil的時候被調用,用以產生一個有效的self.view。這個接口原本是為了讓我們自定義view用的。在不被subclass實現的情況下,也就是[super loadView]的效果,應該就是產生了一個有效的view,也就是一個空白的view。

在上面這種情況下,loadView被實現為空(只有一條打印語句),而且我們沒有通過XIB初始化ViewController,所以在viewDidLoad被執行時,self.view是為nil的。所以在執行[self.view addSubView:customButton]時,loadView被調用,用來產生一個有效的view,使得self.view不再為nil。罷特,我們錯了(-_-!)。我們的loadView什么也沒有做,于是就出現了上面的情形,不斷的調用一個什么都不做的loadView….


當然,我們只要在loadView中增加一句[super loadView]就沒有問題了。但這并不是Cocoa的設計者所期望的。

loadView僅僅應該在開發者希望自行通過編碼而不是Interface Builder定制view的時候被實現,而且不應該在其中調用[super loadView],你的loadView中應該有self.view = …這樣的行為。

如果僅僅是想要在當前view上增加一些UIButton或是UILabel,應該在viewDidLoad里去做,此時不要實現自己的loadView。

總結:用于自定義View.在view為nil時會在self.view調用.重新通過[super view]創建.重寫時手動創建View.

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

推薦閱讀更多精彩內容

  • 7、不使用IB是,下面這樣做有什么問題? 6、請說說Layer和View的關系,以及你是如何使用它們的。 1.首先...
    AlanGe閱讀 719評論 0 1
  • 27、ViewController的didReceiveMemoryWarning是在什么時候調用的?默認的操作是...
    煙雨平生花飛舞閱讀 617評論 0 1
  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 1,861評論 0 2
  • 1,Search Bar 怎樣去掉背景的顏色(storyboard里只能設置background顏色,可是發現cl...
    以德扶人閱讀 2,466評論 2 50
  • UIViewController 的生命周期答:來源:http://www.cnblogs.com/dahe007...
    IreneWu閱讀 641評論 1 2