一、界面控制器
1.1、UIViewController
UIViewController屬于MVC設計模式,其為弱藕合思想衍生的構架。圖如下:
設計模式有很多種,分別為:MVC(Model Controller View)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MVP(Model Presenter ?date binding ?View)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MVVM(Model View Model ?tow way data binding ?View)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ReactiveCocoa(ReactJS ?.Net Rx ?QT)
ViewController只是一個普通的Objective—C的對象,由類中的RootView管理眾多的可顯示控件。iOS 7后,需要為windos指定一個根視圖控制器:self.window.rootViewController=ViewController;
上圖為創建rootViewController的過程示意圖,程序會進到Info.plist文件中查找:UIMainStoryboardFile屬性,如果存在則加載,如果不存在再尋找NSMainNibFile屬性,如果存在,則加載,如果不存在則,進入UIApplicationDelegatedidFinishLaunch方法中,尋找根視圖控制器,如果沒有則顯示黑屏,代表沒有找到根視圖控制器。
ViewController的生命周期:
ViewController是單頁面視圖,是所有可顯示界面控件的容器
1.2 Navigation
Navigation是解決需要多個ViewController交互的時,非層次化的工作流程。
Navigation的設計有固定的呈現方式,UINavigationController的視圖頂部是叫UINavigationBar的控件,它繼承了UIView控件,且通常只是作為多個UINavigationItem的容器,而且它以Stack的形式來管理多個UINavigationItem控件,這意味著導航條上每次只能看到一個UINavigationItem對象。
在同一時刻,UINavigationBar只能看到最上面的UINavigationItem,UINavigationBar最底層的控件被稱為root UINavigationItem。
UINavigationItem作為一個容器,它由標題、左邊N個按鈕、右邊N個按鈕組成,每個按鈕都是一個UIBarButtonItem控件。
其如下一些方法和屬性
- pushNavigationItem:animated:該方法用于將一個UINavigation壓入UINavigationBar棧中。
-popNavigationItemAnimated:該方法用于將UINavigationBar棧頂的UINavigationItem彈出棧
-setItems:animated:同時為UINavigationBar設置多個UINavigationItem控件。
.items:設置或返回UINavigationBar所包含的多個UINavigationItem控件。
.topItem:此為只讀屬性,用于返回UINavigationItem控件最頂層的UINavigationItem控件
.backItem:此為只讀屬性,用于返回UINavigationItem控件最頂層下面的UINavigationItem控件
.title:設置UINavigationItem的標題文本
.hidesBackButton:設置或返回是否顯示后退按鈕。如果將其值設為YES,就會隱藏火腿按鈕
.titleView:設置貨返回UINavigation的標題控件。如果設置了該屬性,UINavigationItem將會使用自定義的標題控件。
.leftBarButtonItem:設置或返回UINavigationItem左邊的多個按鈕組成的數組
.leftBarButtonItem:該屬性用語設置貨返回UINavigationItem左邊的單個按鈕。
.rightBarButtonItem:設置或返回UINavigationItem右邊的多個按鈕組成的數組。
1.3 TabBar
當應用程序需要分成幾個相對獨立的部分時,可以考慮使用UITabBarController組合多個視圖控制器,而UITabBarController將會在底部提供一個UItabBar,隨著用戶點擊不同的標簽頂,整個應用可以呈現完全不同的部分。
UITabBarController有兩種創建方式:project直接選擇Tabbed Application創建基于TabBar類型的iOS應用。
還可以選擇editor下Embed In一個TabBar。
在故事版中創建一個TabBar,查看Tar Bar Item中有哪些可自定義的屬性。
如果程序需要天添加更多的標簽頁,需要兩步:
1、向Storyboard界面設計文件中添加一個新的視圖控制器;
2、在UITabBarController與新的視圖控制器之間建立segue。
二、故事版和App生命周期
2.1Interface Builder
Interface Builder是Xcode集成的界面設計工具,其極大的提高了程序員在創建界面時的效率,其宗旨是“所見即所得”
Storyboard的圖形設計界面把整個視圖、視圖控制器、第一響應者組成和一個整體,這個整體被稱為場景(Scene),此處的場景其實就對應一個窗口界面。也就是說,只要在一個窗口中看到的UIView和各種UI控件都被組合在場景中的UIViewController下,開發者就可以看到更好的組織層次關系。
Main.Storyboard可以包含整個項目的所有應用界面——即使項目包含多個視圖控制器,所有的視圖控制器對應的UIView也都將包含在Main.Storyboard。每個場景都包括一個視圖控制器和First Responder兩個對象,這是每個場景都擁有的兩個特殊對象。First Responder代表當前正在與用戶交互的對象。在應用程序生命周期內,隨著用戶與屏幕交互的變化,First Responder代表的控件會發生改變。假設有一個表單,當用戶觸摸表單中的某個文本域時,改文本域將成為活動文本域,它將會擔當First Responder角色。
2.2 iOS應用的生命周期
我覺得首先應該知道iOS程序的幾種狀態
查閱資料了解到,iOS一共有5種狀態,分別為如下幾種:
1. Not running:應用還沒有啟動,或者應用正在運行但是途中被系統停止。
2. Inactive:當前應用正在前臺運行,但是并不接收事件(當前或許正在執行其它代碼)。一般每當應用要從一個狀態切換到另一個不同的狀態時,中途過渡會短暫停留在此狀態。唯一在此狀態停留時間比較長的情況是:當用戶鎖屏時,或者系統提示用戶去響應某些(諸如電話來電、有未讀短信等)事件的時候。
3. Active:當前應用正在前臺運行,并且接收事件。這是應用正在前臺運行時所處的正常狀態。
4. Background:應用處在后臺,并且還在執行代碼。大多數將要進入Suspended狀態的應用,會先短暫進入此狀態。然而,對于請求需要額外的執行時間的應用,會在此狀態保持更長一段時間。另外,如果一個應用要求啟動時直接進入后臺運行,這樣的應用會直接從Not running狀態進入Background狀態,中途不會經過Inactive狀態。比如沒有界面的應用。注此處并不特指沒有界面的應用,其實也可以是有界面的應用,只是如果要直接進入background狀態的話,該應用界面不會被顯示。
5. Suspended:應用處在后臺,并且已停止執行代碼。系統自動的將應用移入此狀態,且在此舉之前不會對應用做任何通知。當處在此狀態時,應用依然駐留內存但不執行任何程序代碼。當系統發生低內存告警時,系統將會將處于Suspended狀態的應用清除出內存以為正在前臺運行的應用提供足夠的內存。(以上5段為摘抄,是官方文檔的翻譯)
接下來看看應用程序完整的生命周期流程圖(以下為我原創圖)。
其中:第一次初始化對應的方法是:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions