在iOS的原生開發(fā)中,我們需要特別關(guān)注兩個(gè)東西:AppDelegate和ViewController。我們主要的編碼工作就是在AppDelegate和ViewControlle這兩個(gè)類中進(jìn)行的。它們的類圖如下圖所示:AppDelegate是應(yīng)用程序委托對象,它繼承了UIResponder類,并實(shí)現(xiàn)了UIApplicationDelegate委托協(xié)議。UIResponder類可以使子類AppDelegate具有處理響應(yīng)事件的能力,而UIApplicationDelegate委托協(xié)議使AppDelegate能夠成為應(yīng)用程序委托對象,這種對象能夠響應(yīng)應(yīng)用程序的生命周期,該類中繼承的一系列方法在應(yīng)用生命周期的不同階段會被回調(diào)。相應(yīng)的,AppDelegate的子類也可以實(shí)現(xiàn)這兩個(gè)功能。
ViewController類繼承自UIViewController類,它是視圖控制器類,在工程中扮演者根視圖和用戶事件控制類的角色。
應(yīng)用程序生命周期
作為應(yīng)用程序的委托對象,AppDelegate類在應(yīng)用程序生命周期的不同階段會回調(diào)不同的方法。首先,讓我們先了解iOS應(yīng)用的不同狀態(tài)及其彼此間的關(guān)系。
- Not running(非運(yùn)行狀態(tài))。應(yīng)用沒有運(yùn)行或被系統(tǒng)終止。
- Inactive(前臺非活動(dòng)狀態(tài))。應(yīng)用正在進(jìn)入前臺狀態(tài),但是還不能接受事件處理。
- Active(前臺活動(dòng)狀態(tài))。應(yīng)用進(jìn)入前臺狀態(tài),能接受事件處理。
- Background(后臺狀態(tài))。應(yīng)用進(jìn)入后臺后,依然能夠執(zhí)行代碼。如果有可執(zhí)行的代碼,就會執(zhí)行代碼,如果沒有可執(zhí)行的代碼或者將可執(zhí)行的代碼執(zhí)行完畢,應(yīng)用會馬上進(jìn)入掛起狀態(tài)。
- Suspended(掛起狀態(tài))。被掛起的應(yīng)用進(jìn)入一種“冷凍”狀態(tài),不能執(zhí)行代碼。如果系統(tǒng)內(nèi)存不夠,應(yīng)用會被終止。
在應(yīng)用狀態(tài)躍遷的過程中,iOS系統(tǒng)會回調(diào)AppDelegate中的一些方法,并且發(fā)送一些通知。實(shí)際上,在應(yīng)用的生命周期中用到的方法和通知很多,我們選取幾個(gè)主要的方法和通知進(jìn)行纖細(xì)介紹。
為了讓大家更直觀地了解各狀態(tài)與其相應(yīng)地方法、通知間地關(guān)系,下面我們以幾個(gè)應(yīng)用場景為切入點(diǎn)進(jìn)行系統(tǒng)分析。
非運(yùn)行狀態(tài)——應(yīng)用啟動(dòng)場景
點(diǎn)擊Home鍵——應(yīng)用退出場景
輕按兩下Home鍵可以快速進(jìn)入iOS(iOS9及其后續(xù)版本)多任務(wù)欄,此時(shí)可以看到處于后臺運(yùn)行或掛起狀態(tài)地應(yīng)用,也可能有處于終止?fàn)顟B(tài)地應(yīng)用。向上滑動(dòng)應(yīng)用界面,可以刪除這些應(yīng)用并釋放內(nèi)存。
掛起重新運(yùn)行場景
內(nèi)存清除:應(yīng)用終止場景
應(yīng)用界面
蘋果應(yīng)用程序的界面幾乎都是由Cocoa和Cocoa Touch框架中地類和協(xié)議等元素構(gòu)建的,這些元素通過mvc模式有效地組織起來。
macOS應(yīng)用的界面主要使用Cocoa框架開發(fā),Cocoa是一種為應(yīng)用程序提供豐富用戶體驗(yàn)的框架,其核心是:Foundation和AppKit框架。iOS應(yīng)用界面主要使用Cocoa Touch框架開發(fā),核心是:foundation和UIKit框架。Cocoa Touch框架有一套自己的MVC模式,其中視圖和控制器是UIKit中的UIView(及其子類)和UIViewController(及其子類)。
視圖的生命周期
在應(yīng)用運(yùn)行過程中視圖會顯示不同的狀態(tài),這就是視圖的生命周期。視圖生命周期的不同階段會回調(diào)視圖控制器的不同方法。
視圖創(chuàng)建并加載到內(nèi)存中時(shí),會調(diào)用viewDidLoad方法,這時(shí)視圖并未出現(xiàn)。該方法中通常會對所控制的視圖進(jìn)行初始化處理。
視圖可見前后會調(diào)用:viewWillAppear和viewDidAppear方法,視圖不可見前后會調(diào)用viewWillDisappear和viewDidDisappear方法。這4個(gè)方法調(diào)用父類相應(yīng)的方法以實(shí)現(xiàn)其功能,編碼時(shí)調(diào)用父類方法的位置可根據(jù)實(shí)際情況做調(diào)整。
viewDidLoad方法在應(yīng)用運(yùn)行的時(shí)候只調(diào)用一次,二上述4個(gè)方法可以被反復(fù)調(diào)用多次。
視圖
在Cocoa Touch框架中,提供了視圖的“根”類——UIView。
從繼承關(guān)系上看,UIView是所有視圖的“根”。
其中,比較特殊的類是UIControl類,該類是控制類,它及其子類都能響應(yīng)一些高級事件(可以通過xcode中的sent events欄來查看控件是否有高級事件)。,除此之外的類都無法響應(yīng)高級事件。事實(shí)上,視圖也可以響應(yīng)事件,但是這些事件比較低級,需要開發(fā)人員自己處理。很多手勢的開發(fā)都以這些低級事件為基礎(chǔ)。
-
視圖分類
- 控件。繼承UIControl類,能夠響應(yīng)用戶高級事件。
- 窗口。UIWindow對象。一個(gè)iOS應(yīng)用只有一個(gè)UIWindow對象(這點(diǎn)和Android就有很大的區(qū)別了,Android是一個(gè)activity就持有一個(gè)window對象,換句話說一個(gè)Android應(yīng)用是有多個(gè)window對象的),它是所有子視圖的“根”容器(這點(diǎn)就和Android一致)。
- 容器視圖。包括UIScrollView、UIToolbar及它們的子類。
- 顯示視圖。UIImageView、UILabel等。
- 文本和web視圖。
- 導(dǎo)航視圖。為用戶提供從一個(gè)屏幕到另一個(gè)屏幕的導(dǎo)航(或跳轉(zhuǎn))視圖,包括UITabBar和UINavigationBar。
- 警告框和操作表。用于給用戶提供一種反饋或者與用戶進(jìn)行交互。
-
應(yīng)用界面構(gòu)建層次
iOS應(yīng)用界面是由若干個(gè)視圖構(gòu)建而成的,這些視圖對象采用樹形構(gòu)建。下圖是一個(gè)應(yīng)用界面的構(gòu)建層次圖,該應(yīng)用有一個(gè)UIWindow,其中包含一個(gè)UIView根視圖。根視圖下又有3個(gè)子視圖——Button1、Label2和UIView(View2),其中子視圖UIView(View2)中存在一個(gè)按鈕Button3。
一般情況下,應(yīng)用中只包含一個(gè)UIWindow。從UI構(gòu)建層次上講,UIWindow包含一個(gè)根視圖UIView。根視圖一般也只有一個(gè),放于UIWindow中。根視圖的類型決定了應(yīng)用程序的類型。
應(yīng)用界面的構(gòu)建層次是一種樹形結(jié)構(gòu),“樹根”是Window,RootView根視圖是“樹干”,其他視圖對象為“樹冠”。在層次結(jié)構(gòu)中,上下兩個(gè)視圖是“父子關(guān)系”。除了Window,每個(gè)視圖的父視圖有且只有一個(gè),子視圖可以有多個(gè)。它們間的關(guān)系涉及3個(gè)屬性。 -
superview。獲得父視圖對象。
-
subviews。獲得子視圖對象集合。文章來源:http://www.zghlxwxcb.cn/news/detail-729858.html
-
window。獲得視圖所在的界面Window對象。
文章來源地址http://www.zghlxwxcb.cn/news/detail-729858.html
到了這里,關(guān)于iOS的應(yīng)用生命周期以及應(yīng)用界面的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!