|
在這篇文章中,我們將要創建另外一個簡單的應用程序,不過這次要學習下如何使用Views(視圖)和View Controllers(視圖控制器)來創建一個具有多個界面的應用程序。特別地,我們將使用UINavigationController來在應用程序里的兩個界面間進行導航。
在開始構建應用程序之前,讓我們簡單熟悉下iPhone應用程序所用的這個重要設計模式。
模型-視圖-控制器(MVC)模式
Cocoa Touch使用了一種修改版本的MVC模式來處理GUI的顯示。MVC模式(自1979年以來)已經出現很長時間了,它皆在分離顯示用戶界面所需的大量任務,并處理用戶交互。
正如名稱所蘊含的,MVC具有三個主要部分,Model(模型)、View(視圖)和Controller(控制器):
- 模型——模型是特定于領域的數據表現形式。比如說,我們正在創建一個任務列表應用程序。你可能會有一個Task對象的集合,書寫為List<Task>。你或許把這些數據保存在數據庫、XML文件,或者甚至從Web Service中得到,不過MVC不那么關心它們是在何處/如何來持久保存的(乃至它們是什么)。相反,它特別專注于如何顯示這些數據,并處理與用戶交互的。
- 視圖——視圖代表了數據如何實際地顯示出來。在我們這個假設的任務應用程序中,會在一個網頁(以HTML的方式)中來顯示這些任務,也會在一個WPF頁面中(以XAML的方式)來顯示,或者在一個iPhone應用程序中顯示為UITableView 。如果用戶點擊某個任務,要刪除之,那么視圖通常會觸發一個事件,或對Controller(控制器)進行一個回調。
- 控制器——控制器是模型和視圖間的粘合劑。控制器的目的就是獲取模型中的數據,告知視圖來顯示。控制器還偵聽著視圖的事件,在用戶選中一個任務來刪除的時候,控制著任務從模型中刪除。
通過分離顯示數據、持久化數據和處理用戶交互的職責,MVC模式有助于創建易于理解的代碼。而且,它促進了視圖和模型的解耦,以便模型能被重用。例如,在你的應用程序中,有兩個界面,基于Web的和WPF的,那么你可以在兩者中都使用同樣的模型定義代碼。
因而,在很多MVC框架中不管具體的工作方式如何,基本原理都大致如此的。然而,在Cocoa(及Cocoa Touch)中,還是或多或少有所不同,蘋果用MVC來代表Views(視圖)、View Controller(視圖控制器)和Models(模型);但是在不同的控件中,它們卻不是完全一致的,實現的方式也不太一樣。我們將在構建示例應用程序的時候了解更多細節。
在MonoTouch中的視圖和視圖控制器
我之前簡短地提到,在iPhone應用程序中,你只能顯示一個窗口。不過可以包含很多界面。要做到這點,你需要為每個界面都添加一個視圖和視圖控制器。
視圖實際上包含了所有可視化元素,比如標簽、按鈕等等,而視圖控制器處理在視圖上的實際用戶交互(通過事件),并讓你在這些事件被觸發的時候運行相應的代碼。做一個粗略的比喻的話,這就是和ASP.NET或WPF有點類似的模型,在這些模型中,你通過HTML或XAML來定義用戶界面,在后置代碼中處理事件。
在你導向另外一個頁面的時候,就把視圖控制器放到視圖控制器堆棧中。在這個要構建的應用程序中,我們將使用Navigation View Controller(導航視圖控制器,UINavigationController)來處理不同的界面,因為它提供了一種方式可以在界面之間非常容易地導航,通過這種基于層級模式的導航欄,讓你的用戶能夠藉由視圖控制器往后和往前進行導航。
UINavigationController 在很多內置的iPhone應用程序都能看到。例如,在查看短信列表的時候,如果你點擊其中一個,頂部導航欄將在頂部顯示一個左箭頭按鈕,讓你可以回到顯示消息列表的視圖。
具有多個界面的Hello World應用
現在,在概念上了解了MVC的工作原理后,讓我們實際地創建一個應用程序來實踐下。
首先,在MonoDevelop中新建一個MonoTouch iPhone解決方案,命名為Example_HelloWorld_2(如果你忘記如何操作可以參考一下第一篇文章)。
接著,添加兩個視圖控制器(以及相關的視圖)來服務于我們將要執行導航的應用程序中的界面。要完成這個步驟,在項目上點擊右鍵,選擇“Add : New File”。
在Interface Builder中打開.xib文件,添加一個標簽到HelloWorldScreen上,修改文本為“Hello World”,另外添加一個文本到HelloUniverseScreen上,修改文本為“Hello Universe”,如下圖所示:
現在,讓我們添加一個Navigation Controller到Main Window上。方式是,在Interface Builder里打開MainWindow.xib,從Library Window中拖一個Navigation Controller到Document Window上:
Navigation Controller具有如下幾個部分:
- Navigation Controller(導航控制器)——這是控制器的主要部分,處理導航事件,把所有東西糅合在一起。
- Navigation Bar(導航欄)——這是顯示在頂部的工具條,讓用戶能夠看到它處于導航層級的什么位置,并可以導航回去。
- 視圖控制器——這個部分用來控制著視圖的顯示。
- Navigation Item(導航條目)—— 就是顯示在導航欄上的部分,實際上就是用于導航的按鈕,也顯示相應的標題
接下來,我們添加一個Table View到Navigation Controller上,以便能創建一個用于各個界面的鏈接列表。要完成這個步驟,從Library中拖一個UITableView到Navigation Controller里的View Controller上:
改變一下導航欄的標題。在Navigation Controller上雙擊頂部欄,鍵入“Hello World Home!”:
我必須使用Table View來包含Navigation Items嗎?
不用,你可以放任何東西到View Controller中。我們將在后面看到,在你導航到一個新界面的時候,你是調用NavigationController.PushViewController方法,并把要去的界面的View Controller傳遞給它。在用戶點擊按鈕的時候,我們能輕易地實現它。
現在,我們獲得了所需的Navigation Controller以及相關的Table View,還需要讓兩者都可被后置代碼訪問。需要讓Navigation Controller在代碼中可訪問,以便我們能把View Controllers傳給它;也需要讓Table View在代碼中可訪問,以便我們能用要導航到的界面的名稱來填充它。
要實現這個步驟,要為它們創建Outlets,正如我們在第一篇文章所做的那樣的。我們把Navigation Controller取名為mainNavigationController,把Table View取名為mainNavTableView。要確保在AppDelegate中創建它們。在你完成后,Connection Inspector應該看上去如下所示:
接著,需要設置在應用程序啟動的時候顯示Navigation Controller。還記得之前在Main.cs中注釋掉的 Window.AddSubview代碼嗎?對,這就是我們現在要使用的代碼。我們把那行代碼改為如下:
If you have defined a view, add it here:
window.AddSubview(this.mainNavigationController.View);
NET技術:MonoTouch中的MVC簡介,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。