1. 程式人生 > >IOS中 UIView和UIViewController的區別

IOS中 UIView和UIViewController的區別

宣告:這篇文章不是原創,因為覺得寫的好,才複製過來保留

------------------------------------------------------------------------------

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方法相互對應的。