iOS開發--UIWindow與程序啟動原理與兩種創建控制器的方法

View的生命周期

Paste_Image.png

main函數
程序的入口main函數

Paste_Image.png
/* UIApplicationMain底層實現
1.根據principalClassName提供類名創建UIApplication對象
2.創建UIApplicationDelegate對象,并且成為UIApplication對象代理,app.delete = delegate
3.開啟一個主運行循環,處理事件,可以保持程序一直運行。
4.加載info.plist,并且判斷有木有指定main.storyboard,如果指定,就會去加載
*/
Paste_Image.png

UIWindow

UIWindow是一種特殊的View
1.iOS啟動完畢后,創建的第一個視圖控件就是UIWindow。
2.接著創建控制器的View,
3.然后將控制器的view添加到UIWindow上
4.于是控制器的View就顯示在屏幕上了。
5.也就是說沒有UIWindow,就沒有UI界面

程序啟動原理:

執行main
執行UIAPPLICATIONMain
1.創建UIApplication
2.創建UIApplicationDelegate,并且成為UIApplication的代理
3.開啟一個主運行循環
4.加載info.plist,判斷有沒有指定main.storyboard,指定了就加載

加載main.storyboard

1.創建窗口
2.加載main.storyboard,并且加載main.storyboard指定的控制器
3.把新創建的控制器,作為窗口的根控制器,讓窗口顯示出來

1、手動創建窗口步驟

1.自己加載程序啟動-刪掉main
Paste_Image.png
2. 在 AppDelegate
Paste_Image.png

舉例:如果需要看到鍵盤,必須把鍵盤添加到一個View上面去

首先了解什么是窗口:鍵盤、狀態欄是窗口
窗口層級關系:
// 窗口是有層級關系
// UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
Paste_Image.png

2、控制器的創建(storyboard)

1.不通過系統創建:

Paste_Image.png
  1. // instantiateInitialViewController:加載箭頭指向的控制器
Paste_Image.png

3.根據標識來加載:

Paste_Image.png
Paste_Image.png

3、控制器的創建(Xid)

/* 通過xib創建控制器的view
 1.一定要描述xib的文件擁有者是控制器,也就是說這個xib是用來描述控制器
 */

1.通過File`s Owner 更改它的描述類型是控制器

Paste_Image.png

2.修改Xib描述為控制器的類型后,就可以連線了。

Paste_Image.png

3.通過Xib 要是用控制器alloc】 initWithNibName:bundle:】 bundle傳nil默認就是從[NSBundle mainBundle]

Paste_Image.png

LoadView

首先自己去創建跟控制器

Paste_Image.png

在AppDelegate中加載:

Paste_Image.png

這里創建出來是箭頭指向的控制器的View

Paste_Image.png

但是:通過 loadView方法后
系統就不會去加載storyboard描述的控制器的View

Paste_Image.png

總結:

loadView作用:自定義控制器的view
loadView什么時候調用:第一次使用控制器的view的時候調用
注意:在這個方法中如果沒有自定義view,就不能獲取控制器的view
// 一旦重寫了這個方法,就不要調用[super loadView]

// 如果重寫了這個方法,就不會去加載storyboard描述的控制器的View
// LoadView 默認就可以加載storyboard和Xib描述的控制器的View

Paste_Image.png

控制器View的創建(XIB)-尋找控制器的XIb

Paste_Image.png

如果在控制器中實現這個方法:

Paste_Image.png

// 加載跟類名相同的xib
// 如果描述控制器View的xib跟控制器的類名相同,就會去加載

Paste_Image.png

// 只有控制器的init方法底層會調用initWithNibName:bundle:

Paste_Image.png

// 只要通過initWithNibName:bundle:初始化控制器,并且nibName為nil,就會執行以下幾步。
// 1.尋找有沒有跟控制器類名同名但是不帶Controller的xib,如果有就會去加載(View.xib)
// 2.尋找有沒有跟控制器類名同名的xib,如果有就會去加載(ViewController.xib)
// 3.如果都沒有找到,創建空的view,

通過XIB創建控制器View的一覽表:

Paste_Image.png

控制器View的顏色

Paste_Image.png

設置控制器的View = vc.view.alpha = 0;
那么在Windows上添加的按鈕可以點擊,
如果設置控制器的View的顏色為透明色,但是系統認為只是幾乎透明,不可以點擊button

控制器View的懶加載 -(void)ViewDidLoad

控制器的View創建默認就是透明的,看不到也穿不透
我們創建控制器的時候,控制器的View并沒有創建

Paste_Image.png

因為你要使用它,所以這一行就會加載


Paste_Image.png

雖然下面設置了控制器的顏色,但是上面的設置顏色階段就已經顯示了控制器

Paste_Image.png

相當于:我已經加載過ViewDidLoad后,才能設置顏色,所以上面的View的藍色并不會顯示

Paste_Image.png

即便加載loadView,也不會改變它的顏色,因為最終要調用ViewDidLoad,顏色還是最開始的紅色

Paste_Image.png

也就是self.window.rootViewController = ViewController,就不必設置尺寸

開發注意:不要再ViewDidLoad中打印尺寸,在ViewDidAppear中打印尺寸

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

推薦閱讀更多精彩內容