【轉】Controller以及View的幾種建立方式
阿新 • • 發佈:2021-07-15
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
loadView
內部做了怎樣的操作?預設實現即[super loadView]裡面做了什麼事情。
- 它會先去查詢與UIViewController相關聯的xib檔案,通過載入xib檔案來建立UIViewController的view
- 如果在初始化UIViewController指定了xib檔名,就會根據傳入的xib檔名載入對應的xib檔案
-
[[UIViewController alloc] initWithNibName:@"testController" bundle:nil];
- 如果沒有明顯地傳xib檔名,就會載入跟UIViewController同名的xib檔案
-
[[UIViewController alloc] init]; // 載入UIViewController.xib
- 如果沒有找到相關聯的xib檔案,就會建立一個空白的UIView,然後賦值給UIViewController的view屬性,大致如下
self.view = [UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
如果想通過程式碼來建立UIViewController
的view
,就要重寫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 文章乃參考、轉載其他部落格所得,僅供自己學習作筆記使用!!!