View的生命周期
main函數
程序的入口main函數
/* UIApplicationMain底層實現
1.根據principalClassName提供類名創建UIApplication對象
2.創建UIApplicationDelegate對象,并且成為UIApplication對象代理,app.delete = delegate
3.開啟一個主運行循環,處理事件,可以保持程序一直運行。
4.加載info.plist,并且判斷有木有指定main.storyboard,如果指定,就會去加載
*/
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
2. 在 AppDelegate
舉例:如果需要看到鍵盤,必須把鍵盤添加到一個View上面去
首先了解什么是窗口:鍵盤、狀態欄是窗口
窗口層級關系:
// 窗口是有層級關系
// UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
2、控制器的創建(storyboard)
1.不通過系統創建:
- // instantiateInitialViewController:加載箭頭指向的控制器
3.根據標識來加載:
3、控制器的創建(Xid)
/* 通過xib創建控制器的view
1.一定要描述xib的文件擁有者是控制器,也就是說這個xib是用來描述控制器
*/
1.通過File`s Owner 更改它的描述類型是控制器
2.修改Xib描述為控制器的類型后,就可以連線了。
3.通過Xib 要是用控制器alloc】 initWithNibName:bundle:】 bundle傳nil默認就是從[NSBundle mainBundle]
LoadView
首先自己去創建跟控制器
在AppDelegate中加載:
這里創建出來是箭頭指向的控制器的View
但是:通過 loadView方法后
系統就不會去加載storyboard描述的控制器的View
總結:
loadView作用:自定義控制器的view
loadView什么時候調用:第一次使用控制器的view的時候調用
注意:在這個方法中如果沒有自定義view,就不能獲取控制器的view
// 一旦重寫了這個方法,就不要調用[super loadView]
// 如果重寫了這個方法,就不會去加載storyboard描述的控制器的View
// LoadView 默認就可以加載storyboard和Xib描述的控制器的View
控制器View的創建(XIB)-尋找控制器的XIb
如果在控制器中實現這個方法:
// 加載跟類名相同的xib
// 如果描述控制器View的xib跟控制器的類名相同,就會去加載
// 只有控制器的init方法底層會調用initWithNibName:bundle:
// 只要通過initWithNibName:bundle:初始化控制器,并且nibName為nil,就會執行以下幾步。
// 1.尋找有沒有跟控制器類名同名但是不帶Controller的xib,如果有就會去加載(View.xib)
// 2.尋找有沒有跟控制器類名同名的xib,如果有就會去加載(ViewController.xib)
// 3.如果都沒有找到,創建空的view,
通過XIB創建控制器View的一覽表:
控制器View的顏色
設置控制器的View = vc.view.alpha = 0;
那么在Windows上添加的按鈕可以點擊,
如果設置控制器的View的顏色為透明色,但是系統認為只是幾乎透明,不可以點擊button
控制器View的懶加載 -(void)ViewDidLoad
控制器的View創建默認就是透明的,看不到也穿不透
我們創建控制器的時候,控制器的View并沒有創建
因為你要使用它,所以這一行就會加載
雖然下面設置了控制器的顏色,但是上面的設置顏色階段就已經顯示了控制器
相當于:我已經加載過ViewDidLoad后,才能設置顏色,所以上面的View的藍色并不會顯示
即便加載loadView,也不會改變它的顏色,因為最終要調用ViewDidLoad,顏色還是最開始的紅色
也就是self.window.rootViewController = ViewController,就不必設置尺寸