/*
程序啟動過程:
main -> UIApplicationMain
***********UIApplicationMain底層做的事情***********
UIApplicationMain底層做的事情:
1.創建UIApplication對象
2.創建AppDelegate對象,并且賦值給UIApplication對象的代理屬性
3.開啟主運行循環
4.加載info.plist文件,判斷是否指定main.storyboard,如果指定,就去加載。
?*****************main.storyboard底層做的事情*****************
加載main.storyboard底層做什么事情
1.創建UIWindow對象
2.加載storyboard,創建storyboard中的控制器
3.把新創建的控制器作為窗口的根控制器,讓窗口顯示在屏幕上
注意:窗口要顯示出來,必須保證設置尺寸,避免銷毀
*****************窗口補充*****************
常見的窗口:鍵盤,UIActionSheet,UIAlertView,都會交給application.windows
特殊的窗口:狀態欄
窗口的層級:UIWindowLevelNormal
窗口默認都是UIWindowLevelNormal層級
鍵盤的層級永遠是最高的,在顯示之前會獲取當前最高層級數,然后鍵盤的層級+1.
一個應用程序只能有一個主窗口
*****************窗口中底層實現方法*****************
rootViewController好處:1.讓窗口旋轉2.讓代碼結構清晰(自定義跟控制器,控制器的事情寫在控制器里面)
rootViewController底層實現:第一步:讓窗口可以旋轉
makeKeyAndVisible底層實現:
1.成為application的主窗口 application.keyWindow = self.window;
2.讓窗口顯示出來 self.window.hidden = NO;
3.把窗口根控制器的view添加到窗口上 [self.window addSubview:window.rootViewController.view];,
self.window = window 底層實現:就會把當前的窗口添加到屏幕上
************通過storyboard創建控制器************
1.加載storyboard
2.實例化控制器(兩種方式:1.加載箭頭指向的控制器 2.根據標識符創建控制器)
************通過xib創建控制器*****************
1.創建xib的文件
2.往xib里面拖一個view,用來描述控制器的view
3.告訴這個xib是用來描述控制器,設置文件擁有者(file'owner),就可以連線,接著直接連線
錯誤:
loaded the "VC" nib but the view outlet was not set
解決:
加載xib需要連線,怎么解決,首先你需要告這個xib是描述哪個控制器,設置xib的file'owner為控制器Class
************控制器view的加載(loadView)*****************
loadView作用:創建控制器的view
loadView什么時候去調用:第一次使用控制器的view的時候就會調用loadView
只要重寫了loadView這個方法,就必須自己創建控制器的view,系統就不會幫你創建控制器view
HMViewController -> HMView.xib -> ?HMViewController.xib
loadView底層做法
1.判斷下有沒有指定storyboard,如果有,就去加載storyboard描述的控制器的view
2.判斷下有沒有指定nibName,如果有,就去加載nibName描述的控制器的view
? ? 2.如何判斷有沒有指定nibName,[self nibName]
? ? 2.1判斷下nibName是否為空,如果為空,他會嘗試找下有沒有跟控制器同名,但是不帶Controller的xib
? ? 2.2跟控制器同名的xib,nibName = ViewController,但是這一步有條件,前提條件你沒有重寫loadView
? ? 2.3如果都沒有找到,直接創建幾乎透明的view
init方法底層調用initWithNibName:bundle:
**************************導航控制器基本概念***********************
1.創建導航控制器必須要有一個導航控制器的根控制器,因為導航條的內容必須要依賴棧頂控制器,默認第一個根控制器就是棧頂控制器
2. initWithRootViewController:底層會調用pushViewController。
? ?pushViewController:底層會把控制器壓入棧,并且把控制器的view添加到導航條上面。
3.等需要push控制器的view完全顯示的時候,會拿到push控制的navigationController屬性賦值導航控制器
? ?vc.navigationController = nav;
4.導航控制器的viewControllers用來保存導航控制器里面所有的子控制器
5.導航控制器永遠顯示出來的界面是棧頂控制器的view
6.調用這個方法,并不會馬上出棧,等控制器的view完全移除父控件,才會出棧,控制器出棧后,就會被銷毀
********************************導航條的內容***********************
1.導航條的內容由棧頂控制器的UINavigationItem決定,為什么要這樣設計,因為導航控制器只有一個導航條,如果每個子控制器都能設置,就不知道聽誰的了,所以由顯示出來的控制器決定。
2.UINavigationItem:是一個模型,用來決定導航條的內容。
3.UIBarButtonItem:是一個模型,用來決定導航條上按鈕的內容。
4.導航條上面的子控件的位置由系統決定,但是尺寸是由我們自己決定
4.1 [button sizeToFit]默認計算按鈕尺寸,根據按鈕的內容計算出最合適的尺寸
5.在ios7之后,默認就會導航條上的按鈕的圖片渲染成藍色
5.1 如何保持圖片最原始的效果,不要渲染
? ?[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
5.2Item就是模型,MVC,修改模型就能改界面