天天看點

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

使用在第2章介紹過的ib,可以添加視圖和控制器,然後以松耦合的方式将它們連接配接在一起,這個過程不需要編寫或生成任何代碼。如圖3-2所示,從iphone window-based project模闆建立新的應用程式。這是一個帶有視窗的基本應用程式,類似之前的appdelegate。這裡不在appdelegate中完成所有工作,而是通過添加視圖和控制器,在控制器中編寫視圖控制代碼。

注意 就像第2章中看到的一樣,monotouch會為outlet生成少量代碼,類似于objective-c的頭檔案。

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

monotouch包含一個帶有控制器的iphone(或ipad)視圖模闆,該控制器包含了一個帶有預連接配接視圖的xib檔案。如圖3-3所示,使用iphone view with controller模闆建立一個名為sampleviewcontroller的新檔案。本示例的目标是通過模闆在視圖内建立ui,當應用程式加載時顯示視圖,并在相關控制器類内執行代碼控制視圖的顯示。

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

現在,在ib中打開mainwindow.xib檔案。因為不會直接在設計者視圖上添加控件,是以可以關閉該視圖。如圖3-4所示,要添加新的uiviewcontroller,可以将它拖到xib檔案中。

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

現在要在sampleviewcontroller.xib内設計視圖并将它從xib加載。如圖3-5所示,在mainwindow.xib視窗選擇view controller(視圖控制器),然後在attributes inspector中修改nib name域的值為sampleviewcontroller,這樣就可以讓ib知道要從sampleviewcontroller.xib中加載控制器的視圖。

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

另外,還要将uiviewcontroller的類修改為sampleviewcontroller,而不是它的基類uiviewcontroller。如圖3-6所示,要實作這個,在mainwindow.xib視窗中選擇view controller,然後在identity inspector中将class域的值修改為sampleviewcontroller,注意觀察mainwindow.xib視窗中type(類型)的變化。

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

為了在應用程式加載完畢後顯示sampleviewcontroller的視圖,還需要從appdelegate代碼将控制器視圖添加到視窗中,因為處理如finishedloading等應用程式生命周期的地方就是appdelegate。是以,需要在appdelegate内給sampleviewcontroller添加outlet。回想一下,可以在ib的library視窗的classes标簽頁為類添加outlet。選擇appdelegate,添加一個名稱為samplevc的outlet,類型設定為sampleviewcontroller。如圖3-7所示,添加outlet後,就可以在mainwindow.xib的appdelegate中将 outlet與sampleviewcontroller連接配接起來。完成連接配接并儲存檔案後,monotouch會自動生成如代碼清單3-1所示的包含outlet名稱和類型的屬性的代碼。

提示 在mainwindow.xib視窗中右擊appdelegate,并拖動到mainwindow.xib視窗中的sampleviewcontroller,将會彈出一個outlet可以連接配接的類型清單。

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

代碼清單3-1 在appdelegate中自動生成的sampleviewcontroller屬性

現在,可以将sampleviewcontroller的視圖添加到視窗了,在appdelegate的finishedlaunching方法内添加以下代碼:

如果現在運作應用程式,sampleviewcontroller.xib中的視圖會顯示,因為還沒在視圖内添加任何東西,是以顯示的是一個空白螢幕。此時,可以對之前添加的sampleviewcontroller.xib及其與它相關的控制器類進行處理了。

在ib中添加單個uitextview到sampleviewcontroller的視圖,它将在本章後面擴充後的示例中用做運作日志檢視器。現在,簡單添加一些文本來驗證是否一切都已經正确連接配接起來。在ib中打開sampleviewcontroller.xib并将uitextview拖到視圖設計器,将它填滿整個螢幕。選擇文本視圖,選擇attributes inspector。清除示例文本,取消選擇可編輯複選框,這樣文本框就不能在運作時被使用者更改了,它隻能由代碼更改。

與之前做的一樣,為了能讓程式修改文本視圖,需要為它設定outlet。不過,這次outlet不是在appdelegate中建立,而是在sampleviewcontroller中建立。在sampleviewcontroller.xib視窗中,可以看到file抯 owner的類型是sample-viewcontroller,該值表示目前xib檔案的視圖控制器是哪一個,目前情況下是sampleviewcontroller。是以,任何添加到sampleviewcontroller類的outlet和連接配接都會在sampleviewcontroller類中建立一個屬性,這樣就可以通過代碼通路它們了。類似于在appdelegate中添加outlet一樣,在sampleviewcontroller類中為uitextview添加一個名為loggingview的outlet,然後将它連接配接到設計器中的uitextview(如圖3-8所示)。

再重複一下,隻要與outlet建立了連接配接,monodevelop就會自動生成相關屬性,隻有這次會在sampleviewcontroller類中生成。在sampleviewcontroller類内,重寫viewdidload方法,并添加以下代碼修改文本視圖的文本屬性:

《MonoTouch開發實踐指南》一3.2 在IB中使用視圖和控制器

現在運作應用程式,可以看到sampleviewcontroller的視圖已加載,而在視圖内可看到如圖3-9所示的由代碼輸出的字元串。

如果不想使用ib在mainwindow.xib檔案中建立sampleviewcontroller,也可以直接在代碼中建立。要在monotouch中實作這個,隻要直接在代碼中簡單執行個體化視圖控制器的執行個體,并如之前那樣将它的視圖添加到視窗就可以了。因為控制器是視圖的擁有者,而不是相反,是以對象圖的根就是控制器。是以,采用該方法時,會看到這樣一個警告:如果不為控制器保持一個類變量,它會被垃圾回收器回收。

要在代碼中建立視圖和控制器,可以跳過之前在mainwindow.xib視窗中所做的所有步驟,而在appdelegate類中做以下修改。仍然可以在ib中設計sampleviewcontroller的視圖,唯一的變化是使用以下代碼建立控制器:

現在,應用程式的設計是由uiviewcontroller管理第一個視圖的顯示,而視圖是在ib中進行設計的。sampleviewcontroller及其視圖也可以在代碼中完成。在本章後面将示範如何通過代碼控制視圖。從現在開始,繼續使用ib,以适應這種工具。

當為應用程式添加功能時,視圖會變得越來越複雜,尤其是在需要控制器類在視圖生命周期内捕獲并處理附加子視圖的事件時。此外,在應用程式中也可以有多個視圖和控制器。不過,每一個視圖都将由一個控制器進行管理,其基本結構與現在這個簡單示例是一樣的。

注意 有些控制器會專門設計成可以管理多個視圖,如uitabbarcontroller、uinavigationcontroller或uitableviewcontroller。uitabbarcontroller将會在本章後面使用到,而uinavigationcontroller和uitableviewcontroller将會在第5章介紹。

繼續閱讀