最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入講解iOS開發(fā)中的UIViewController

 更新時(shí)間:2015年09月25日 10:14:34   投稿:goldensun  
這篇文章主要介紹了iOS開發(fā)中的UIViewController,其中以UIViewController作為著重講解,需要的朋友可以參考下

UIViewController顧名思義:視圖控制器。應(yīng)該在MVC設(shè)計(jì)模式中扮演控制層的角色。一些初學(xué)者在最開始的時(shí)候一直不理解為何有了UIView還要UIViewController做什么用,不都是向視圖中增加view。在此我要聲明一下
UIViewController和Uiview是兩個(gè)不同的類UIViewController是視圖控制器 而UIView是視圖也就是說,UIViewController是控制UIView的。你也可以認(rèn)為UIViewController就是一個(gè)相框,而UIView就是一個(gè)相片,相框可以隨時(shí)隨地的拿走這個(gè)相片而換另外一張相片,或者在這張相片上加一個(gè)新的相片。而相片卻不能操縱相框的。 UIView工作在第一線,向用戶展示表現(xiàn)的內(nèi)容,并接受用戶的交互。UIViewController相當(dāng)于導(dǎo)演,按照計(jì)劃編排屬下的UIView以何種形式展現(xiàn),其中包含一些花哨的技巧,如翻轉(zhuǎn)、淡入淡出等。 UIVewController的另一個(gè)功能是處理用戶交互操作,注意這里我說的是”處理”,當(dāng)然UIViewController本身是不知道用戶交互的,這就需要UIView將用戶的交互操作(例如:touchesBegintouchesMoved)傳遞上來。一般常用的兩種方法完成這種傳遞: 1、[self nextResponder] touchesBegin:touches… 2、使用Notification 不管以何種方式,如果UIViewController得到了用戶的輸入,那么它應(yīng)該對UIView做些改變以響應(yīng)用戶的輸入,這里要注意UIViewController應(yīng)該只改變UIView的表現(xiàn),而不應(yīng)該處理其它事情,更多的操作通過Delegate來進(jìn)行,關(guān)于Delegate的應(yīng)用場合下次講解消息的傳遞方式中一起闡述。請大家記?。篣IView是一個(gè)視圖,UIViewController是一個(gè)控制器,每一個(gè)viewController管理著一個(gè)view。
如果你開發(fā)的應(yīng)用界面非常的簡單,確實(shí)沒有必要用控制器控制視圖,但是對于視圖中復(fù)雜的數(shù)據(jù)顯示和數(shù)據(jù)處理,如果沒有這個(gè)控制器,這樣會(huì)使得代碼的繼承深度大大增加,不利于代碼的閱讀,首先看下官方API對UIViewController的解釋:The UIViewController class provides the fundamental view-management model for iPhone applications(視圖控制器為Iphone的應(yīng)用程序提供了基礎(chǔ)的視圖管理模型) You use each instance of UIViewController to manage a view hierarchy(你可以使用視圖控制器管理視圖的繼承)。從這里就可以看出,如果使用了視圖控制器,你就可以方便的管理視圖中的子視圖,假如沒有了這個(gè)控制器,可想而知每個(gè)視圖豈不是都要用繼承才能管理彼此的關(guān)系。
UIViewController的基礎(chǔ)功能是管理界面中的view,但是一個(gè)復(fù)雜的應(yīng)用程序肯定有好多的視圖控制器,那么自然如果視圖控制要有管理自己的功能就更加強(qiáng)大。先看API文檔:View controllers rarely operate in isolation.If your application uses a navigation or tab bar controller,or if your application presents views modally,then it typically has several view controllers interacting with each other to implement those navigation features(視圖控制器很少單獨(dú)使用。假如你的應(yīng)用程序要使用導(dǎo)航或者轉(zhuǎn)換條控制器,或許是你的應(yīng)用程序要呈現(xiàn)模態(tài)的視圖,明顯的這里有很多的視圖控制器相互關(guān)聯(lián)來實(shí)現(xiàn)導(dǎo)航的功能)。所以可以看出,UINavigationController和UITabBarController是用來控制視圖控制器的使用的,同樣他們的跟視圖也是UIViewController,這里就說明了UIViewController是自己可以控制自己的。這也是為何我們使用UINavigationController的時(shí)候不允許在把一個(gè)NavigationController推入堆棧中,這樣極容易形成自己隊(duì)遞歸調(diào)用自己,造成堆棧溢出。以下是使用UIViewController應(yīng)該注意的地方。
1.首先看loadView和viewDidLoad的區(qū)別,兩者都是用來初始化試圖控制器中的視圖如何顯示的。還是先看官方API解釋:If you create your views manually, you must override this method and use it to create your views.If you use Interface Builder to create your views and initialize the view controller that is,you initialize the view using the initWithNibName:bundle: method,set the nibName and nibBundle properties directly, or create both your views and view controller in Interface Builder—then you must not override this method.(如果你手動(dòng)創(chuàng)建一個(gè)視圖控制器,你必須重載這個(gè)方法,去使用他創(chuàng)建你的視圖。如果你使用Interface builder創(chuàng)建和初始化的視圖控制器,你就不必重載此方法)。所以當(dāng)你手動(dòng)創(chuàng)建一個(gè)視圖控制器的時(shí)候一定要注意重載loadView,否則你的視圖將不回顯示你增加的任何字視圖。
2.viewDidUnLoad這個(gè)方法最容易誤導(dǎo)人,先看API解釋:Called when the controller's view is released from memory(當(dāng)控制器的視圖從內(nèi)存中釋放的時(shí)候被調(diào)用),個(gè)人覺得官方的解釋對英語非母語的國家的人來說,很容易理解為視圖控制器release的時(shí)候,調(diào)用此方法。但是如果實(shí)際調(diào)試以下,視圖控制器釋放的時(shí)候不會(huì)調(diào)用該方法。再進(jìn)一步分析API文檔:This method is called as a counterpart to the viewDidLoad method.
It is called during low memory conditions when the view controller needs to release its view
and any objects associated with that view to free up memory(這個(gè)方法是被調(diào)用相對于viewDidLoad方法的,在內(nèi)存警告的情況下,當(dāng)試圖控制器需要釋放它的視圖和這個(gè)視圖中相關(guān)聯(lián)的任何對象來釋放內(nèi)存的時(shí)候,調(diào)用此方法)。這里還有一點(diǎn)要注意的時(shí),當(dāng)出現(xiàn)內(nèi)存警告的時(shí)候,是調(diào)用正在顯示的視圖控制器的父視圖控制器的viewdidUnload方法,而不是正在顯示的視圖控制器的viewDidUnload方法。因?yàn)槿绻{(diào)用了正在顯示的視圖控制器的viewDidUnload方法,那么用戶正在看的界面就會(huì)消失,雖然釋放了內(nèi)存但是用戶顯然沒法接受,自然要釋放該視圖下面看不到的視圖控制器中的視圖。被釋放的視圖,下次加載的時(shí)候再調(diào)用viewDidLoad的方法,所以ViewDidUnload的方法是和viewDidload方法相互對應(yīng)的。

UIViewController生命周期
UIViewControl是IOS程序中的一個(gè)重要組成部分,扮演者一個(gè)大管家的身份,管理著程序中的眾多視圖,今天看看了官方文檔并做了如下一些簡單的記錄:
 
何時(shí)加載view,加載的原則是什么,視圖何時(shí)消失等問題,文檔中講的都很詳細(xì)。
 
  Controller的view最好在需要顯示時(shí)再去加載,并且在系統(tǒng)發(fā)出內(nèi)存警告時(shí)釋放比必要的view及相關(guān)的數(shù)據(jù)對象。
 
一、UIViewController的初始化
 
  初始化時(shí)會(huì)根據(jù)需要調(diào)用init,initWithCoder等相關(guān)函數(shù),這個(gè)時(shí)候我們可以做一下簡單的初始化操作,建立ViewController中需要使用的數(shù)據(jù)模型等,不建議在初始化階段就直接創(chuàng)建view及其他與顯示有關(guān)的對象(應(yīng)該放到loadView的時(shí)候去創(chuàng)建,或者采用懶加載的方法創(chuàng)建)。
 
  我們都知道ViewController可以通過代碼和xib兩種方式創(chuàng)建,這兩種方式的初始化流程也不盡相同。
 
  1)使用xib創(chuàng)建的VC
 
  xib其實(shí)最終是會(huì)把我們的設(shè)置保存成一個(gè)數(shù)據(jù)集,當(dāng)需要初始化構(gòu)建VC的時(shí)候,回去讀取記錄的數(shù)據(jù)集,然后幫我們動(dòng)態(tài)的創(chuàng)建VC,因此可以想象它在初始化時(shí)會(huì)先去找看是否實(shí)現(xiàn)initWithCoder方法,如果該類實(shí)現(xiàn)了該方法,就直接調(diào)用initWithCoder方法創(chuàng)建對象,如果沒有實(shí)現(xiàn)的話就調(diào)用init方法。調(diào)用完初始化方法以后緊接著會(huì)調(diào)用awakeFromNib方法,在這個(gè)方法里面我們可以做進(jìn)一步的初始化操作。
 
  2)使用代碼創(chuàng)建VC
 
  使用代碼創(chuàng)建時(shí),我們根據(jù)需要手動(dòng)的創(chuàng)建VC中的數(shù)據(jù),如果自己定制VC時(shí),還需要在init中調(diào)用[super init]。
 
二、UIViewController中View的load和unload
 
  前面講了不建議在VC初始化的時(shí)候就創(chuàng)建view及其他與顯示相關(guān)的代碼,官方文檔建議將View的初始化操作放到loadView的時(shí)候再做,當(dāng)VC接到內(nèi)存告警時(shí)會(huì)調(diào)用didRecieveMemoryWarning這個(gè)時(shí)候我們就要做出響應(yīng),釋放暫時(shí)不需要的對象。如果無視這個(gè)警告,系統(tǒng)內(nèi)存不夠用時(shí)會(huì)會(huì)繼續(xù)發(fā)送,如果還得不到處理就會(huì)強(qiáng)制退出程序。下面看具體的loadView和unloadView時(shí)候都會(huì)做什么操作。
 
  1)Load周期

當(dāng)需要顯示或者訪問view屬性時(shí),view沒有創(chuàng)建的話,VC就會(huì)調(diào)用loadView方法,在這個(gè)時(shí)候會(huì)創(chuàng)建一個(gè)view并將其賦給VC.view屬性。緊接著就會(huì)調(diào)用VC的viewDidLoad方法,這個(gè)時(shí)候VC.view保證是有值的,可以做進(jìn)一步的初始化操作,例如添加一些subview。注意:定制VC時(shí),如果覆蓋loadView方法,不需要調(diào)用[super loadView]方法。
 
  2)Unload周期

當(dāng)app收到內(nèi)存警告的時(shí)候,會(huì)調(diào)用每一個(gè)VC的didRecieveMemoryWarning方法,我們需要做出響應(yīng),釋放程序中暫時(shí)不需要的資源。通常都會(huì)重寫該方法,重寫時(shí)候需要調(diào)用super的該方法。如果檢測到當(dāng)前VC的view可以被安全釋放的話,就會(huì)調(diào)用viewWillUnload方法,這個(gè)我們必須要重視,因?yàn)楫?dāng)VC的view消失時(shí)候它的subviews可能會(huì)被一起釋放,我們需要根據(jù)具體情況做一些記錄,以保證下次能夠正確創(chuàng)建,同時(shí)不出現(xiàn)內(nèi)存泄漏。調(diào)用viewWillUnload以后,會(huì)將VC.view屬性設(shè)置成nil,然后在調(diào)用viewDidUnload方法,這個(gè)時(shí)候我們可以釋放那些強(qiáng)引用的對象。

相關(guān)文章

  • iOS開發(fā)學(xué)習(xí)之監(jiān)測程序的崩潰次數(shù)詳解

    iOS開發(fā)學(xué)習(xí)之監(jiān)測程序的崩潰次數(shù)詳解

    iOS開發(fā)中遇到程序崩潰是很正常的事情,下面這篇文章主要給大家介紹了關(guān)于iOS如何監(jiān)測程序崩潰次數(shù)的相關(guān)資料,文中通過詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • iOS獲取本地音頻文件(屬性/信息)

    iOS獲取本地音頻文件(屬性/信息)

    這篇文章主要為大家詳細(xì)介紹了iOS獲取本地音頻文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • iOS UITextField、UITextView只限輸入中文、英文、數(shù)字及實(shí)時(shí)限制字符個(gè)數(shù)的封裝實(shí)現(xiàn)代碼

    iOS UITextField、UITextView只限輸入中文、英文、數(shù)字及實(shí)時(shí)限制字符個(gè)數(shù)的封裝實(shí)現(xiàn)代碼

    這篇文章主要介紹了 iOS UITextField、UITextView只限輸入中文、英文、數(shù)字及實(shí)時(shí)限制字符個(gè)數(shù)封裝實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 快速上手IOS UIBezierPath(貝塞爾曲線)

    快速上手IOS UIBezierPath(貝塞爾曲線)

    本文主要介紹了IOS 貝塞爾曲線(UIBezierPath)的基礎(chǔ)知識。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • iOS開發(fā)檢測是否開啟定位、是否允許消息推送等權(quán)限的實(shí)例

    iOS開發(fā)檢測是否開啟定位、是否允許消息推送等權(quán)限的實(shí)例

    下面小編就為大家分享一篇iOS開發(fā)檢測是否開啟定位、是否允許消息推送等權(quán)限的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS實(shí)現(xiàn)貝塞爾曲線動(dòng)畫

    iOS實(shí)現(xiàn)貝塞爾曲線動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)貝塞爾曲線動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • iOS關(guān)于多張圖片上傳、地址返回順序問題及解決方案

    iOS關(guān)于多張圖片上傳、地址返回順序問題及解決方案

    這篇文章主要介紹了iOS關(guān)于多張圖片上傳、地址返回順序問題,文章給大家?guī)砹巳N解決方案,通過實(shí)例文字說明相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • 最新評論

    思茅市| 通州市| 中宁县| 上林县| 泸溪县| 岳池县| 丽江市| 正安县| 汝城县| 会昌县| 白山市| 平山县| 雷波县| 黔江区| 呼和浩特市| 葵青区| 噶尔县| 乐至县| 星子县| 大埔区| 大冶市| 玉龙| 延安市| 田阳县| 扶沟县| 临汾市| 钟山县| 葵青区| 嘉定区| 水城县| 介休市| 杭州市| 双流县| 河西区| 广饶县| 万全县| 永济市| 含山县| 鲁山县| 衡阳县| 罗田县|