《MonoTouch开发实践指南》一1.2 创建MonoTouch应用程序
1.2 創(chuàng)建MonoTouch應(yīng)用程序
在本節(jié)中,將編寫一個帶有標(biāo)簽和按鈕的簡單應(yīng)用程序,并通過單擊按鈕來改變標(biāo)簽的文本顯示。完成后的應(yīng)用程序?qū)⑷鐖D1-10所示。
1.2.1 創(chuàng)建用戶界面
首先要做的是創(chuàng)建用戶界面。返回剛才在MonoDevelop創(chuàng)建的包含一個空白窗口的應(yīng)用程序,如果IB還沒打開,雙擊MainWindow.xib文件打開IB。前面提及過,IB是蘋果的用戶界面設(shè)計工具,可以用它來創(chuàng)建應(yīng)用程序的界面。如果曾經(jīng)進行過Windows或ASP.NET開發(fā),就會覺得它的作用有點類似于Visual Studio中的設(shè)計工具,但是功能不同。IB管理的是xib文件,它是一個XML格式的文件,在文件里封裝了所有定義應(yīng)用程序用戶界面的對象。當(dāng)生成應(yīng)用程序時,xib文件會轉(zhuǎn)換為以.nib為擴展名的二進制格式文件(這就是常說的“nib文件”)。基本上,xib文件就是UI層的序列化對象圖。現(xiàn)在,可根據(jù)以下步驟創(chuàng)建一個用戶界面:
1)在IB中,如圖1-11所示那樣在Library窗口中選擇Objects(對象)標(biāo)簽頁。
2)在Library窗口內(nèi)滾動中間區(qū)域的滾動條,直到看到類型為UILabel的標(biāo)簽控件(Label)。然后將它拖動到窗口的設(shè)計界面上,并放置在靠窗口頂部的位置。
3)現(xiàn)在,添加一個按鈕用來改變標(biāo)簽的顯示。在Library窗口中找到類型為UIButton的Round Rect Button對象,將它拖到窗口里,并放在標(biāo)簽下面。
4)將按鈕加入設(shè)計界面后,雙擊按鈕進入編輯模式,將按鈕的文本改為“Say Hello”。
5)保存xib文件后,返回MonoDevelop并運行應(yīng)用程序。
當(dāng)應(yīng)用程序在模擬器中運行時,會看到添加的按鈕和標(biāo)簽。觸碰(實際只能單擊,因為是在模擬器上運行的)按鈕,會看到按鈕的背景顏色變成了藍色,但什么也沒有發(fā)生。要在觸碰按鈕時改變標(biāo)簽的文本,還要為按鈕編寫相應(yīng)的代碼。準(zhǔn)備好,繼續(xù)!
1.2.2 添加outlet
IB不像常用的微軟開發(fā)工具那樣支持類代碼生成。要在IB中定義的視圖與代碼之間實現(xiàn)交互,需要使用outlet,它可在代碼中引用在xib文件中定義的對象。雖然需要一些手動步驟來完成該工作,但很快就會熟悉。而且,通過C#語言(尤其是局部類)與MonoTouch設(shè)計工具相結(jié)合,實際接觸的代碼比在使用objective-C和Xcode時要少很多。現(xiàn)在,回到IB。
在IB中,需要為示例創(chuàng)建兩個outlet,一個用于按鈕,以便訂閱其事件;另一個用于標(biāo)簽,以便通過程序來修改它的文本。下面先創(chuàng)建標(biāo)簽的outlet,在Library窗口中選擇Classes標(biāo)簽頁,然后在列表中選擇AppDelegate。最后,如圖1-12所示,選擇AppDelegate之后,在顯示的Library窗口下半部分區(qū)域選擇Outlets。
AppDelegate是一個類,其作用是接收由UIApplication操作所觸發(fā)的調(diào)用,例如應(yīng)用程序啟動完成(有點類似回調(diào)接口,不過并不完全相同)。這里,“委托”(Delegate)并不是.NET中所熟悉和喜愛的委托,而是整個IOS SDK中常用的Objective-C技術(shù)。MonoTouch支持Objective-C 的Delegates(委托),將該委托抽象化,讓C#和C# Delegates(委托)都可以對它進行訪問。如果暫時無法理解這個概念也不要緊,第2章會詳細講述它。現(xiàn)在,只需要知道在應(yīng)用程序中可通過AppDelegate類訪問按鈕和標(biāo)簽就可以了,因此需要在AppDelegate中為它們創(chuàng)建outlet。
要將UILabel的outlet添加到AppDelegate中,單擊Library窗口左下角的+按鈕添加一個outlet,將它的默認的名字myOutlet1修改為HelloLabel。新outlet的類型(Type)的默認值是id,它的值也可以是任何的NSObject,和C#的對象有點類似,將該值改為UILabel,這樣就可將標(biāo)簽連接到outlet了(下面要做的事),而且只能連接到UILabel,不能是其他對象。完成后,將會看到如圖1-13所示的Library窗口。
回顧一下剛才所做的,會給有微軟開發(fā)經(jīng)驗的用戶帶來非常不同的用戶體驗。現(xiàn)在,有了保存用戶界面顯示所需要的所有序列化對象的xib文件,有了實現(xiàn)用戶界面對象之間交互的代碼,而要將xib中的對象與代碼連接起來,需要在IB的AppDelegate中為UILabel添加outlet。剩下的工作就是將UILabel連接到剛剛定義的outlet,而這將會在C#中創(chuàng)建一個指向UILabel的屬性。
要連接窗口中的UILabel與AppDelegate中的UILabel outlet,在MainWindow.xib窗口中選擇AppDelegate,然后在主菜單中打開Connections Inspector (Tools→Connections Inspector)窗口。在Outlet區(qū)域中,會看到剛才創(chuàng)建的HelloLable outlet。單擊Connections Inspector中outlet右邊的圓形圖標(biāo),并按住鼠標(biāo)鍵(如果是多按鈕鼠標(biāo),按住鼠標(biāo)左鍵),將它拖到窗口的標(biāo)簽上。按住鼠標(biāo)鍵將鼠標(biāo)指針移動標(biāo)簽上面,會看到標(biāo)簽的顏色變成了藍色,這說明它的屬性類型沒有錯,是outlet定義的UILabel類型。如果拖動到按鈕上,就不會有提示表明該控件可以與outlet連接。這是因為之前將outlet的類型由id改為UILabel了,如果不修改,類型還是id,outlet就可以連接任何控件。這就留下了一個隱患,有可能做出錯誤的連接。在標(biāo)簽上松開鼠標(biāo)按鈕即可建立連接。下面講述在MonoDevelop中會觸發(fā)什么事件,不過,要先完成按鈕的連接。重復(fù)之前的步驟將按鈕連接到outlet。這次,outlet的名稱為SayHellButton,類型為UIButton。重復(fù)之前的拖放操作,這次的目標(biāo)是窗口中的UIButton。請注意,也可以將outlet拖動到MainWindow.xib窗口的元素上進行連接(這也是為什么要保留樹形視圖的原因),因為它們都代表著相同的對象。如果元素在窗口的初始狀態(tài)是隱藏的,就會相當(dāng)方便。將IB中完成的操作保存。此時,應(yīng)用程序所需要的東西已經(jīng)準(zhǔn)備完畢,可通過代碼實現(xiàn)對象串之間的交互了(如圖1-14所示)。
現(xiàn)在開始把注意力集中到代碼上。首先,先看一下在IB中保存所有東西后,MonoDevelop如何響應(yīng)所有這些outlet。在MonoDevelop中,展開Solution Explorer的MainWindow.xib,打開MainWindow.xib.designer.cs文件,將看到代碼清單1-1所示的代碼。在代碼中定義了一個局部類,包含了所有在IB中創(chuàng)建的outlet連接。這里看到的是AppDelegate類的一部分類,包括為IB中每一個連接所創(chuàng)建的多個屬性。此外,要注意使用Connect特性(attributes)來聲明這些屬性(properties)。這些都是MonoTouch為代碼連接到IB中的outlet所要做的。最后要注意的是AppDelegate類的Register特性,MonoTouch會使用它在Objective-C運行時注冊一個類。
注意 嚴(yán)格地說,MonoTouch會自動注冊NSObject的子類。默認情況下,它使用Full.Namespace.Typemape這樣的格式來注冊子類。特性的作用就是將注冊類名映射成“簡寫名稱”(ShortName);否則,MonoTouch.UIKit.UIButton就連接不到UIButton。
代碼清單1-1 MainWindow.xib.designer.cs // // <autogenerated> // This code was generated by a tool. // Mono Runtime Version: ... // // Changes to this file may cause incorrect behavior and // will be lost if the code is regenerated. // </autogenerated> // namespace LMT12 {// Base type probably should be MonoTouch.Foundation.NSObject or// subclass[MonoTouch.Foundation.Register("AppDelegate")]public partial class AppDelegate{private MonoTouch.UIKit.UIWindow __mt_window;private MonoTouch.UIKit.UIButton __mt_SayHelloButton;private MonoTouch.UIKit.UILabel __mt_HelloLabel;#pragma warning disable 0169[MonoTouch.Foundation.Connect("window")]private MonoTouch.UIKit.UIWindow window {get {this.__mt_window = ((MonoTouch.UIKit.UIWindow)(this.GetNativeField ("window")));return this.__mt_window;}set {this.__mt_window = value;this.SetNativeField ("window", value);}}[MonoTouch.Foundation.Connect("SayHelloButton")]private MonoTouch.UIKit.UIButton SayHelloButton {get {this.__mt_SayHelloButton = ((MonoTouch.UIKit.UIButton)(this.GetNativeField ("SayHelloButton")));return this.__mt_SayHelloButton;}set {this.__mt_SayHelloButton = value;this.SetNativeField ("SayHelloButton", value);}}[MonoTouch.Foundation.Connect("HelloLabel")]private MonoTouch.UIKit.UILabel HelloLabel {get {this.__mt_HelloLabel = ((MonoTouch.UIKit.UILabel)(this.GetNativeField ("HelloLabel")));return this.__mt_HelloLabel;}set {this.__mt_HelloLabel = value;this.SetNativeField ("HelloLabel", value);}}} }打開Main.cs文件,會看到局部類AppDelegate的另一部分代碼。這里可以添加響應(yīng)按鈕的TouchUpInside事件的代碼,并改變標(biāo)簽的文本,詳細代碼請看代碼清單1-2。
保存后,運行應(yīng)用程序。當(dāng)應(yīng)用程序在模擬器中運行后,單擊按鈕,并注意標(biāo)簽上文本的變化。可以看到,標(biāo)簽尺寸太小,容納不了全部文本,因而在文本的末尾使用了省略號代替(其實,這是故意的,目的是為了講述將要在IB中做的事)。現(xiàn)在,返回IB,修正這個問題。
注意 在IB和MonoDevelop之間來回切換是很常見的事,因而盡早熟悉有好處。
返回IB,在窗口中選擇UILabel并通過拉伸增加它的寬度。如圖1-15所示,IB會顯示Guide Geometry來協(xié)助調(diào)整大小和布局,以符合蘋果人機界面指南(Human Interface Guideline,HIG)。
然后,設(shè)置標(biāo)簽文本居中顯示。選擇標(biāo)簽,打開Attributes Inspector(Tools→ Attribures Inspector),在Attribures Inspector布局區(qū)域,設(shè)置文本的排列(alignment)為居中(centered)。保存修改并返回MonoDevelop運行應(yīng)用程序。單擊按鈕,這次就可在標(biāo)簽內(nèi)看到全部文本了。
如果回頭再看MonoDevelop,也許希望它能生成一些代碼反映剛才對標(biāo)簽所做的改動。然而,IB不會生成代碼,它會將它內(nèi)部的改動直接序列化到xib文件中。在整個過程中,只有鉤上(hook)outlet的屬性才會生成代碼,而且是在MonoDevelop觀察到xib文件發(fā)生改動時創(chuàng)建的。代碼清單1-3列出了xib文件中反映標(biāo)簽變化的代碼,節(jié)點表示增大后標(biāo)簽的尺寸。
返回MonoDevelop并運行應(yīng)用程序,單擊按鈕,這次會看到“Hello MonoTouch”已經(jīng)全部顯示出來了。值得慶賀,終于完成了這個簡單的Hello World示例。現(xiàn)在已經(jīng)可以在模擬器中看到應(yīng)用程序的運行情況了,下一步要做的是將它移植到設(shè)備上進行開發(fā)。
總結(jié)
以上是生活随笔為你收集整理的《MonoTouch开发实践指南》一1.2 创建MonoTouch应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国高性能计算机TOP100出炉 曙光联
- 下一篇: 云安全:云访问安全代理(CASB)系统的