1. 程式人生 > 其它 >【轉】Controller以及View的幾種建立方式

【轉】Controller以及View的幾種建立方式

Controller的三種建立方式

方式一:直接alloc和init建立控制器
UIViewController * vc=[[UIViewController alloc]init];
方式二:通過storyboard建立
//注意:這裡僅僅是載入名稱叫做Test的storyboard, 並不會建立storyboard中的控制器以及控制元件
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
   
//建立storyboard中箭頭指向的控制器
UIViewController *vc = [storyboard instantiateInitialViewController];
    
//注意:如果在一個storyboard中有多個控制器,如何指定建立哪個特定的控制器呢?我們可以根據storyBoard中的Identifier去載入建立控制器 UIViewController *vc2 = [storyboard instantiateViewControllerWithIdentifier:@"two"];
方式三:通過NIB建立

Xib是storyboard的前身,使用storyboard的好處是可以建立起介面跳轉的關係,看起來更加直觀。

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"
One" bundle:nil];

可能報錯的地方:

was unable to load a nib named "One"' 不能載入

產生原因:在xib檔案中沒有進行任何操作。
解決方法:往xib中拖一個view

loaded the "One" nib but the view outlet was not set.'

設定File‘s Owner,可以理解為設定這個檔案歸誰所有,對File‘s Owner和view進行連線。

View的建立方式:通過loadView方法

其實直接看下面這張圖我們就非常清楚了


當view需要被展示而它卻是nil時,viewController會呼叫loadView

方法去建立View;
loadView內部做了怎樣的操作?
預設實現即[super loadView]裡面做了什麼事情。

  1. 它會先去查詢與UIViewController相關聯的xib檔案,通過載入xib檔案來建立UIViewController的view
  • 如果在初始化UIViewController指定了xib檔名,就會根據傳入的xib檔名載入對應的xib檔案
  • [[UIViewController alloc] initWithNibName:@"testController" bundle:nil]; 
  • 如果沒有明顯地傳xib檔名,就會載入跟UIViewController同名的xib檔案
  • [[UIViewController alloc] init]; // 載入UIViewController.xib 
  1. 如果沒有找到相關聯的xib檔案,就會建立一個空白的UIView,然後賦值給UIViewController的view屬性,大致如下
self.view = [UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];

如果想通過程式碼來建立UIViewControllerview,就要重寫loadView方法,並且不需要呼叫[super loadView],因為在上面已經提到:若沒有xib檔案,[super loadView]預設會建立一個空白的UIView。我們既然要通過程式碼來自定義UIView,那麼就沒必要事先建立一個空白的UIView,以節省不必要的開銷。

注意:loadView只調用一次,即第1次開啟程式的時候發現沒有view,則先去找loadView,如果有的話就建立view,如果沒有另找他法。載入過之後,第2次就不會再呼叫loadView了。所以,如下程式碼是一個死迴圈,因為它一直在找view。

-(void)loadView{
    self.view.backgroundColor=[UIColor greenColor];
}
5人點贊 OC筆記 from:https://www.jianshu.com/p/f33935584e11 文章乃參考、轉載其他部落格所得,僅供自己學習作筆記使用!!!