你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 深刻講授iOS開辟中的UIViewController

深刻講授iOS開辟中的UIViewController

編輯:IOS開發綜合

UIViewController望文生義:視圖掌握器。應當在MVC設計形式中飾演掌握層的腳色。一些初學者在最開端的時刻一向不睬解為什麼有了UIView還要UIViewController做甚麼用,不都是向視圖中增長view。在此我要聲明一下
UIViewController和Uiview是兩個分歧的類UIViewController是視圖掌握器 而UIView是視圖也就是說,UIViewController是掌握UIView的。你也能夠以為UIViewController就是一個相框,而UIView就是一個相片,相框可以隨時隨地的拿走這個相片而換別的一張相片,或許在這張相片上加一個新的相片。而相片卻不克不及把持相框的。 UIView任務在第一線,向用戶展現表示的內容,並接收用戶的交互。UIViewController相當於導演,依照籌劃編排屬下的UIView以何種情勢展示,個中包括一些花梢的技能,如翻轉、淡入淡出等。 UIVewController的另外一個功效是處置用戶交互操作,留意這裡我說的是”處置”,固然UIViewController自己是不曉得用戶交互的,這就須要UIView將用戶的交互操作(例如:touchesBegintouchesMoved)傳遞下去。普通經常使用的兩種辦法完成這類傳遞: 1、[self nextResponder] touchesBegin:touches… 2、應用Notification 不論以何種方法,假如UIViewController獲得了用戶的輸出,那末它應當對UIView做些轉變以呼應用戶的輸出,這裡要留意UIViewController應當只轉變UIView的表示,而不該該處置其它工作,更多的操作經由過程Delegate來停止,關於Delegate的運用場所下次講授新聞的傳遞方法中一路論述。請年夜家記住:UIView是一個視圖,UIViewController是一個掌握器,每個viewController治理著一個view。
假如你開辟的運用界面異常的簡略,確切沒有需要用掌握器掌握視圖,然則關於視圖中龐雜的數據顯示和數據處置,假如沒有這個掌握器,如許會使得代碼的繼續深度年夜年夜增長,晦氣於代碼的浏覽,起首看下官方API對UIViewController的說明:The UIViewController class provides the fundamental view-management model for iPhone applications(視圖掌握器為Iphone的運用法式供給了基本的視圖治理模子) You use each instance of UIViewController to manage a view hierarchy(你可使用視圖掌握器治理視圖的繼續)。從這裡便可以看出,假如應用了視圖掌握器,你便可以便利的治理視圖中的子視圖,假設沒有了這個掌握器,可想而知每一個視圖豈不是都要用繼續能力治理彼此的關系。
UIViewController的基本功效是治理界面中的view,然則一個龐雜的運用法式確定有很多多少的視圖掌握器,那末天然假如視圖掌握要有治理本身的功效就加倍壯大。先看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(視圖掌握器很少零丁應用。假設你的運用法式要應用導航或許轉換條掌握器,也許是你的運用法式要出現模態的視圖,顯著的這裡有許多的視圖掌握器互相聯系關系來完成導航的功效)。所以可以看出,UINavigationController和UITabBarController是用來掌握視圖掌握器的應用的,異樣他們的跟視圖也是UIViewController,這裡就解釋了UIViewController是本身可以掌握本身的。這也是為什麼我們應用UINavigationController的時刻不許可在把一個NavigationController推入客棧中,如許極輕易構成本身隊遞歸挪用本身,形成客棧溢出。以下是應用UIViewController應當留意的處所。
1.起首看loadView和viewDidLoad的差別,二者都是用來初始化試圖掌握器中的視圖若何顯示的。照樣先看官方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.(假如你手動創立一個視圖掌握器,你必需重載這個辦法,去應用他創立你的視圖。假如你應用Interface builder創立和初始化的視圖掌握器,你就不用重載此辦法)。所以當你手動創立一個視圖掌握器的時刻必定要留意重載loadView,不然你的視圖將不回顯示你增長的任何字視圖。
2.viewDidUnLoad這個辦法最輕易誤導人,先看API說明:Called when the controller's view is released from memory(當掌握器的視圖從內存中釋放的時刻被挪用),小我認為官方的說明對英語非母語的國度的人來講,很輕易懂得為視圖掌握器release的時刻,挪用此辦法。然則假如現實調試以下,視圖掌握器釋放的時刻不會挪用該辦法。再進一步剖析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(這個辦法是被挪用絕對於viewDidLoad辦法的,在內存正告的情形下,當試圖掌握器須要釋放它的視圖和這個視圖中相干聯的任何對象來釋放內存的時刻,挪用此辦法)。這裡還有一點要留意的時,當湧現內存正告的時刻,是挪用正在顯示的視圖掌握器的父視圖掌握器的viewdidUnload辦法,而不是正在顯示的視圖掌握器的viewDidUnload辦法。由於假如挪用了正在顯示的視圖掌握器的viewDidUnload辦法,那末用戶正在看的界面就會消逝,固然釋放了內存然則用戶明顯沒法接收,天然要釋放該視圖上面看不到的視圖掌握器中的視圖。被釋放的視圖,下次加載的時刻再挪用viewDidLoad的辦法,所以ViewDidUnload的辦法是和viewDidload辦法互相對應的。

UIViewController性命周期
UIViewControl是IOS法式中的一個主要構成部門,飾演者一個年夜管家的身份,治理著法式中的浩瀚視圖,明天看看了官方文檔並做了以下一些簡略的記載:
 
什麼時候加載view,加載的准繩是甚麼,視圖什麼時候消逝等成績,文檔中講的都很具體。
 
  Controller的view最好在須要顯示時再去加載,而且在體系收回內存正告時釋放比需要的view及相干的數據對象。
 
1、UIViewController的初始化
 
  初始化時會依據須要挪用init,initWithCoder等相干函數,這個時刻我們可以做一下簡略的初始化操作,樹立ViewController中須要應用的數據模子等,不建議在初始化階段就直接創立view及其他與顯示有關的對象(應當放到loadView的時刻去創立,或許采取懶加載的辦法創立)。
 
  我們都曉得ViewController可以經由過程代碼和xib兩種方法創立,這兩種方法的初始化流程也不盡雷同。
 
  1)應用xib創立的VC
 
  xib其實終究是會把我們的設置保留成一個數據集,當須要初始化構建VC的時刻,歸去讀取記載的數據集,然後幫我們靜態的創立VC,是以可以想象它在初始化時會先去找看能否完成initWithCoder辦法,假如該類完成了該辦法,就直接挪用initWithCoder辦法創立對象,假如沒有完成的話就挪用init辦法。挪用完初始化辦法今後緊接著會挪用awakeFromNib辦法,在這個辦法外面我們可以做進一步的初始化操作。
 
  2)應用代碼創立VC
 
  應用代碼創立時,我們依據須要手動的創立VC中的數據,假如本身定制VC時,還須要在init中挪用[super init]。
 
2、UIViewController中View的load和unload
 
  後面講了不建議在VC初始化的時刻就創立view及其他與顯示相干的代碼,官方文檔建議將View的初始化操作放到loadView的時刻再做,當VC接到內存告警時會挪用didRecieveMemoryWarning這個時刻我們就要做出呼應,釋放臨時不須要的對象。假如疏忽這個正告,體系內存不敷用時會會持續發送,假如還得不隨處理就會強迫加入法式。上面看詳細的loadView和unloadView時刻都邑做甚麼操作。
 
  1)Load周期

當須要顯示或許拜訪view屬性時,view沒有創立的話,VC就會挪用loadView辦法,在這個時刻會創立一個view並將其賦給VC.view屬性。緊接著就會挪用VC的viewDidLoad辦法,這個時刻VC.view包管是有值的,可以做進一步的初始化操作,例如添加一些subview。留意:定制VC時,假如籠罩loadView辦法,不須要挪用[super loadView]辦法。
 
  2)Unload周期

當app收到內存正告的時刻,會挪用每個VC的didRecieveMemoryWarning辦法,我們須要做出呼應,釋放法式中臨時不須要的資本。平日都邑重寫該辦法,重寫時刻須要挪用super的該辦法。假如檢測到以後VC的view可以被平安釋放的話,就會挪用viewWillUnload辦法,這個我們必需要看重,由於當VC的view消逝時刻它的subviews能夠會被一路釋放,我們須要依據詳細情形做一些記載,以包管下次可以或許准確創立,同時不湧現內存洩露。挪用viewWillUnload今後,會將VC.view屬性設置成nil,然後在挪用viewDidUnload辦法,這個時刻我們可以釋放那些強援用的對象。

【深刻講授iOS開辟中的UIViewController】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved