自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MonoTouch:用.NET開發(fā)iOS應(yīng)用

移動(dòng)開發(fā) iOS
直到最近,要為蘋果的iPhone開發(fā)應(yīng)用程序的唯一選擇就是一頭扎進(jìn)蘋果的開發(fā)系統(tǒng)中。這意味著,你必須“愿意”在XCode IDE中編寫Objective-C代碼。對(duì)于很多開發(fā)人員,學(xué)習(xí)Objective-C被看作是一個(gè)巨大的障礙。特別對(duì)于哪些從來不用擔(dān)心內(nèi)存管理、指 針和C語(yǔ)言要負(fù)責(zé)處理的東西的開發(fā)人員來說,更是如此。

隨著MonoTouch框架(Novell的Mono Project的一部分)的出現(xiàn),這一切都將改變。Mono Project是微軟.NET平臺(tái)的開源實(shí)現(xiàn)。其允許你在幾乎任何平臺(tái)上運(yùn)行.NET應(yīng)用程序,包括Apple、FreeBSD、Linux、Unix等 等。MonoTouch是Mono Project的新組成部分,讓你能夠用C#和.NET平臺(tái)編寫可以運(yùn)行在iPhone上的應(yīng)用程序。

本篇文章的目的,就是提供MonoTouch平臺(tái)的一個(gè)完整介紹,讓大家知道到那里獲取必要的工具,MonoTouch有什么樣的限制,以及如何構(gòu)建一個(gè)簡(jiǎn)單的應(yīng)用程序。

背景和限制

對(duì)于打算為iPhone開發(fā)應(yīng)用的.NET開發(fā)人員而言,MonoTouch的出現(xiàn)無(wú)疑是一件好事。然而,在決定創(chuàng)建應(yīng)用程序之前,有一些限制和背景知識(shí)需要先了解清楚。

它如何工作?

在創(chuàng)建MonoTouch應(yīng)用程序的時(shí)候,大部分非UI方面的.NET 3.5功能依舊可用,或者一些還處于計(jì)劃之中(如.NET 4.0的功能)也囊括其中。這讓你可以使用很多業(yè)已熟悉的.NET Framework技術(shù)來編寫應(yīng)用程序,包括Windows Communication Framework (WCF)、Workflow Foundation (WF)等等。也包括幾乎所有的基類庫(kù)(Base Class Library,BCL),涵蓋諸如垃圾收集(Garbage Collection)、線程、數(shù)學(xué)函數(shù)、System.Net、加密等。對(duì)于可用的標(biāo)準(zhǔn).NET程序集列表,見http://monotouch.net/Documentation/Assemblies。MonoTouch是一種基礎(chǔ).NET函數(shù)庫(kù)的特別定制版本,這也類似Silverlight和Moonlight的實(shí)現(xiàn)方式。

這意味著,你能夠使用MonoTouch的核心程序集來編譯標(biāo)準(zhǔn)的.NET 3.5代碼成相應(yīng)的函數(shù)庫(kù),并在你的應(yīng)用程序中使用它們。因此,如果你有一個(gè)用于其它應(yīng)用程序的特別函數(shù)庫(kù),其包含著一些用于工程問題的高級(jí)數(shù)學(xué)函數(shù),那 么只需簡(jiǎn)單地把這些代碼庫(kù)加入到你的MonoTouch解決方案中,并引用它。在你構(gòu)建解決方案的時(shí)候,編譯器就利用MonoTouch核心函數(shù)庫(kù)對(duì)其進(jìn)行編譯,接著就能在iPhone應(yīng)用程序中使用它了。

MonoTouch也包括一些原生iPhone API的包裝函數(shù)庫(kù),如訪問位置(Location,GPS)、加速計(jì)、地址簿等的函數(shù)。MonoTouch也提供相應(yīng)的功能,讓你能夠調(diào)用那些尚未進(jìn)行包裝的原生Objective-C函數(shù)庫(kù),所以你可以直接和現(xiàn)存的Objective-C代碼進(jìn)行互操作。

我如何創(chuàng)建用戶界面(UI),我能使用Silverlight嗎?

MonoTouch應(yīng)用程序的UI需要使用蘋果的Interface Builder(界面創(chuàng)建器,IB)應(yīng)用程序來創(chuàng)建,IB連同iPhone SDK一起提供。Interface Builder使用Cocoa Touch(蘋果用于iPhone的UI框架)控件對(duì)象,這些控件對(duì)象在iPhone上原生提供的。這意味著,你能在應(yīng)用程序中使用所有的標(biāo)準(zhǔn) iPhone控件,如選擇器(Pickers)、滑動(dòng)條(Sliders)、按鈕等等。

你也能通過代碼來創(chuàng)建界面,即實(shí)例化Cocoa Touch對(duì)象后,把它們添加到應(yīng)用程序的視圖(Views)中(關(guān)于視圖,后面會(huì)詳細(xì)講述)。

然而,你不能利用傳統(tǒng)的.NET技術(shù),如Silverlight、WPF、WinForms等來創(chuàng)建MonoTouch界面。

Cocoa Touch使用一種融合了MVC(Model View Controller)模式思想的結(jié)構(gòu),我們將在后面一篇文章中介紹。

我如何分發(fā)我的應(yīng)用?

MonoTouch應(yīng)用程序的分發(fā)完全和傳統(tǒng)iPhone應(yīng)用程序的分發(fā)一樣,既可以通過蘋果App Store,也可以通過企業(yè)部署。

App Store是一個(gè)在線資源庫(kù),讓用戶可以付費(fèi)購(gòu)買(如果不是免費(fèi)的話)和下載應(yīng)用程序??梢詮膇Tunes中訪問,或直接通過iPhone本身來訪問。為 了得到通過App Store分發(fā)應(yīng)用的許可,你必須向蘋果注冊(cè),并支付每年99美元的年費(fèi)。

企業(yè)部署方式就是為公司開發(fā)內(nèi)部應(yīng)用程序,并分發(fā)給員工等人員使用,無(wú)需把應(yīng)用在App Store中列出。

什么是許可模型?

不像Mono那樣,MonoTouch不是開源的,且是一個(gè)收費(fèi)產(chǎn)品。這意味著,如果你打算開發(fā)一些實(shí)際的應(yīng)用,就必須購(gòu)買軟件許可。

專業(yè)版($399)——單個(gè)的個(gè)人開發(fā)人員許可,讓你可以開發(fā)應(yīng)用程序,并通過蘋果App Store來分發(fā)它們。

企業(yè)版($999)——單個(gè)的企業(yè)開發(fā)人員許可,讓你可以開發(fā)應(yīng)用程序,并通過蘋果App Store來分發(fā)它們,或者進(jìn)行企業(yè)部署。

企業(yè)版,5人($3999)——和企業(yè)版一樣,只是提供了5個(gè)坐席的授權(quán)。

以上所有選項(xiàng)都包括了一年的免費(fèi)升級(jí)權(quán)益。

還有一個(gè)評(píng)估版本,你只能把應(yīng)用部署到模擬器中。出于介紹的目的,我們只需要評(píng)估版本就行。

MonoTouch有哪些限制?

沒有即時(shí)(JIT)編譯

根據(jù)蘋果的iPhone政策,任何應(yīng)用程序都不能包含需要JIT編譯的代碼。但是稍等,.NET確實(shí)能正確工作,是不?對(duì),不過MonoTouch是通過把應(yīng)用程序編譯為原生的iPhone程序集來跳過這個(gè)限制的。但是,這也帶來了幾個(gè)限制。

  • 泛型——泛型是由JIT編譯器在運(yùn)行時(shí)進(jìn)行實(shí)例化的,然而,Mono具備一種提前(Ahead of Time ,AOT)編譯的模式,可以為類似List這樣的泛型集合生成方法和屬性。而泛型的其他用法,例如泛型虛方法、泛型類型上的 P/Invokes和Dictionary上的值類型,就不被支持(雖然存在Dictionary的代替方法)。
  • 動(dòng)態(tài)代碼生成——因?yàn)閯?dòng)態(tài)代碼生成依賴于JIT編譯器,所以對(duì)任何動(dòng)態(tài)語(yǔ)言編譯的過程也不能支持。包括System.Reflection.Emit、 Remoting和動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)。

C#是唯一的語(yǔ)言

另外,目前用于編寫MonoTouch應(yīng)用程序的唯一可用語(yǔ)言是C#。Visual Basic.NET有望在MonoTouch未來的發(fā)布中支持,不過此時(shí)此刻我們別無(wú)選擇。

更多信息

相關(guān)限制的完整列表和更多的信息,包括一些代替方法,可用參見http://monotouch.net/Documentation/Limitations。#p#

入門

要進(jìn)入為iPhone創(chuàng)建MonoTouch應(yīng)用程序的大門,我們需要下面幾樣?xùn)|西:

  • 一個(gè)使用Intel CPU的Mac電腦,其要安裝MacOSX 10.5或10.6 (Leopard或Snow Leopard)
  • 蘋果的iPhone SDK 3.0或更高版本
  • Mono的當(dāng)前版本
  • MonoTouch SDK
  • 一個(gè)IDE工具,如MonoDevelop或XCode,或一個(gè)文本編輯器程序

安裝著Leopard或Snow Leopard的Mac

這是最重要也是最容易忽視的需求。盡管,理論上你能在任何平臺(tái)上開發(fā)大部分應(yīng)用程序,然而iPhone Simulator和Interface Builder只能在Leopard和Snow Leopard上運(yùn)行。另外,編譯器本身用到了一些特定于Intel Mac機(jī)器的底層功能,所以購(gòu)買這樣一臺(tái)電腦是絕對(duì)必須的。

蘋果的iOS SDK

iOS SDK可通過http://developer.apple.com/iphone/來免費(fèi)下載,不過必須在蘋果網(wǎng)站上注冊(cè),才能訪問這個(gè)地址。

在安裝了iPhone SDK后,要確保你能正常啟動(dòng)iPhone Simulator。要啟動(dòng)它,只需打開Spotlight,鍵入iPhone Simulator。

Mono

一旦你測(cè)試iPhone Simulator正常,那么就要安裝Mono for OSX的最新版。Mono可以從http://mono-project.com/Downloads下載。記住要點(diǎn)擊“Intel”版本的鏈接,不要點(diǎn)CSDK版本。同樣,安裝MonoTouch SDK之前也需要安裝Mono的。Mono的安裝包是磁盤鏡像的形式,掛接鏡像,雙擊安裝包,根據(jù)安裝向?qū)瓿砂惭b過程。

MonoTouch SDK

接下來,下載和安裝最新的MonoTouch SDK。你既可以在MonoTouch商店(http://monotouch.net/Store)購(gòu)買,購(gòu)買后會(huì)收到一個(gè)下載鏈接,也可以從http://monotouch.net/DownloadTrial下載評(píng)估版。如果購(gòu)買了MonoTouch,你就能把應(yīng)用程序部署到一臺(tái)正確配置了的iPhone上,不過也可像我這樣,僅僅在模擬器中運(yùn)行。所以,目前 而言試用/評(píng)估版就足夠了。

文本編輯器或集成開發(fā)環(huán)境(IDE)

如果你打算創(chuàng)建MonoTouch應(yīng)用程序,所需的所有東西就是前面提及的,和一個(gè)文本編輯器。你能創(chuàng)建所有代碼文件,并用命令行(終端窗口)來手動(dòng)編 譯。這種方式雖然可行,但是實(shí)際操作起來可能會(huì)非常痛苦,所以我們還是需要使用一個(gè)IDE來開發(fā)我們的應(yīng)用程序。

你可以編輯/hack一下XCode(隨iPhone SDK一起安裝)來利用MonoTouch的函數(shù)庫(kù)和編譯器,也可以使用MonoTouch版的MonoDevelop,其已經(jīng)為MonoTouch應(yīng)用 程序做好所有配置了。我們理所當(dāng)然要用MonoDevelop,所以訪問這里http://monodevelop.com/Download/Mac_MonoTouch來 下載它。要安裝MonoDevelop,只用把下載文件拖到應(yīng)用程序目錄中就行。

如果你已經(jīng)正確安裝Mono,那么MonoDevelop應(yīng)該可以正常啟動(dòng)。#p#

Hello World應(yīng)用程序

現(xiàn)在,一切已經(jīng)準(zhǔn)備妥當(dāng),讓我們開始來嘗試開發(fā)點(diǎn)東西了。

MonoDevelop

首先,啟動(dòng)MonoDevelop。你應(yīng)該會(huì)看到和下圖類似的界面【譯者注:如果OSX的首選語(yǔ)言是中文的話,MonoDevelop的菜單和工具欄的文字顯示不正常,所以最好把English拖到語(yǔ)言選項(xiàng)的第一位】:

作為一個(gè)標(biāo)準(zhǔn)的IDE,看上去還是蠻熟悉的。它非常類似Visual Studio、SharpDevelop、Visual C# Express等等。

我們創(chuàng)建一個(gè)新解決方案,來包含iPhone項(xiàng)目。這里的解決方案和Visual Studio中的概念一樣,實(shí)際上你可以在MonoDevelop中打開Visual Studio創(chuàng)建的解決方案。在MonoDevelop中的一個(gè)不同點(diǎn)就是,你能夠在一個(gè)MonoDevelop實(shí)例中打開多個(gè)解決方案,正如下面的截圖所示:

這完全是由于在OSX中,你不能啟動(dòng)MonoDevelop的多個(gè)實(shí)例(事實(shí)上,任何程序都不行),且沒有任何變通方法。所以,如果你需要在解決方案間切 換(例如,你希望另外打開一個(gè)包含示例代碼的解決方案),你就能簡(jiǎn)單地一次性打開多個(gè)。

那么,說了上面這么多,讓我們現(xiàn)在來創(chuàng)建一個(gè)解決方案吧。在菜單中,點(diǎn)File:New:Solution:

我們要?jiǎng)?chuàng)建一個(gè)如下面截圖所示的“iPhone MonoTouch Project”。選中它,并命名為Example_HelloWorld_1。

這里再次和Visual Studio中創(chuàng)建新解決方案的對(duì)話框很類似。點(diǎn)擊Forward ,顯示下一屏,直接點(diǎn)擊OK,因?yàn)槲覀儾恍枰@些功能:

你現(xiàn)在應(yīng)該可以看到如下所示的解決方案視圖了(注意,我展開了解決方案中的節(jié)點(diǎn),以便顯示出所有文件和引用程序集):

我們來過一遍這些東西:

  • References ——這個(gè)文件夾包含MonoTouch應(yīng)用程序需要的基本引用。MonoTouch程序集包括特定于iPhone的任何東西,也包括了所有Cocoa Touch控件的包裝器,以及類似位置、數(shù)據(jù)等核心iPhone接口。以System.開頭的程序集是.NET的基類庫(kù)和運(yùn)行時(shí),其被裁減過以便能運(yùn)行在 iPhone上。
  • Main.cs ——這和控制臺(tái)應(yīng)用程序、WPF應(yīng)用程序等是一致的。在這里調(diào)用的是static void main() ,其是作為應(yīng)用程序的入口點(diǎn)。過一下我們會(huì)仔細(xì)研究一下這個(gè)文件。
  • MainWindow.xib和MainWindow.xib.designer.cs ——這個(gè)和Winforms Window或WPF Window類似。xib文件實(shí)際上要在Interface Builder中進(jìn)行編輯,而designer.cs文件包含這個(gè)窗體的屬性。

讓我們來仔細(xì)研究一下Main.cs文件中的代碼:

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using MonoTouch.Foundation; 
  5. using MonoTouch.UIKit; 
  6.  
  7. namespace Example_HelloWorld_1 
  8.     public class Application 
  9.     { 
  10.         static void Main (string[] args) 
  11.         { 
  12.             UIApplication.Main (args); 
  13.         } 
  14.     } 
  15.  
  16.     // The name AppDelegate is referenced in the MainWindow.xib file. 
  17.  
  18.     public partial class AppDelegate : UIApplicationDelegate 
  19.     { 
  20.         // This method is invoked when the application has loaded its UI and its ready to run 
  21.         public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
  22.         { 
  23.             // If you have defined a view, add it here: 
  24.             // window.AddSubview (navigationController.View);            
  25.  
  26.             window.MakeKeyAndVisible ();             
  27.  
  28.             return true
  29.         } 
  30.  
  31.         // This method is required in iPhoneOS 3.0 
  32.         public override void OnActivated (UIApplication application) 
  33.         { 
  34.         } 
  35.     } 

 

其中有兩個(gè)有趣的地方。它包含一個(gè)Application類和一個(gè)AppDelegate類。從這里開始,和傳統(tǒng)的.NET GUI開發(fā)就有所不同了。

iPhone應(yīng)用程序的工作方式是,應(yīng)用程序類(繼承于UIApplication)包含了所有窗口、視圖、控件和資源等等;同時(shí)應(yīng)用程序委托類中(繼承于UIApplicationDelegate)處理來自iPhone OS的回調(diào),實(shí)際上會(huì)包括應(yīng)用程序運(yùn)行周期(Lifecycle)的事件(例如應(yīng)用程序啟動(dòng)和應(yīng)用程序終止)和大量的運(yùn)行時(shí)事件(例如低內(nèi)存報(bào)警)。

通過在應(yīng)用程序委托類處理這些事件,你就能夠響應(yīng)它們。比如,在應(yīng)用程序關(guān)閉的時(shí)候,WillTerminate()方法將被調(diào)用,這樣就有機(jī)會(huì)去保存任何用戶數(shù)據(jù)、應(yīng)用程序狀態(tài)等。

在Application類中,具有一個(gè)Main() 方法。調(diào)用UIApplication.Main,Objective-C運(yùn)行時(shí)將查找MainWindow.xib文件(它包含了 UIApplicationDelegate類的名稱),實(shí)例化Application類(為單實(shí)例)后,就接著調(diào)用AppDelegate類中運(yùn)行周期事件。

  你不必把主窗體的名稱命名為“MainWindow.xib” (即所謂的主界面文件)。你可以任意命名它,只需告知編譯系統(tǒng)去查找哪個(gè)文件就行。如果你希望它去查找不同的文件,在項(xiàng)目文件上右鍵打開項(xiàng)目選項(xiàng),點(diǎn)擊 Options ,接著在Build : iPhone Application : Main Interface File中即可設(shè)置主窗體對(duì)應(yīng)的文件。在應(yīng)用程序啟動(dòng)的時(shí)候,Objective-C運(yùn)行時(shí)將會(huì)嘗試去加載那個(gè)文件,并根據(jù)這個(gè)文件內(nèi)的設(shè)置來查找應(yīng)用程序委托類。

  另外,你也可以任意命名你的應(yīng)用程序委托類。默認(rèn)情況下,它的名稱為“AppDelegate”。要改變它,在Interface Builder中打開主界面文件,修改Application Delegate的名稱。

一會(huì)我們會(huì)回到Main.cs文件上來,不過首先來深入研究下應(yīng)用程序的實(shí)際GUI。

Interface Builder

目前為止,已經(jīng)讀到了我們的iPhone應(yīng)用程序的部分代碼,可以深入研究一下如何構(gòu)建它的界面了。蘋果的應(yīng)用程序設(shè)計(jì)工具包稱之為 Interface Builder。Interface Builder可以和開發(fā)環(huán)境松耦合。它可以編輯那些定義應(yīng)用程序GUI的.xib文件。NIB和XIB的比較:Nib文件包含了窗口、控件等的XML表示,類似于WPF/Silverlight中的XAML模型。

不管是在XCode中編寫Objective-C,或在MonoDevelop中編寫C#,Interface Builder的用法都是完全一樣的。能這樣,完全是因?yàn)镸onoDevelop能夠監(jiān)測(cè)Nib文件的變更,并添加/刪除對(duì)應(yīng)于Nib文件的適當(dāng)代碼到 designer.cs文件中。

你當(dāng)然可以不打開Interface Builder,純粹通過編程來創(chuàng)建整個(gè)GUI,有些開發(fā)人員確實(shí)也是這樣做的。很多事情在Interface Builder也無(wú)法完成,就此而言,你還是需要編程來完成某些事情。Interface Builder隱藏了一些復(fù)雜的部分,在入門的時(shí)候,很容易使用Interface Builder來熟悉iPhone應(yīng)用程序GUI的一些概念。

那么,說了這么多,讓我們來著手創(chuàng)建界面了。在MainWindow.xib文件上雙擊。Interface Builder將啟動(dòng),并能看到如下圖所示的東西:

讓我們逐一研究一下這些窗口。從左到右,分別是:Document Window(文檔窗口)、Design Surface Window(設(shè)計(jì)界面窗口)、Library Window(控件庫(kù)窗口)和Inspector Window(檢查器窗口)。

首先讓我們來看Document Window:

這個(gè)窗口顯示了在.xib文件中的所有對(duì)象。這是默認(rèn)的視圖,你會(huì)發(fā)現(xiàn)它雖然樣子漂亮,但沒有太大用處,因?yàn)槟愕膶?duì)象實(shí)際上是層級(jí)排列的,而圖標(biāo)視圖只能同時(shí)顯示一級(jí)。在我們添加控件到界面上的時(shí)候,它不會(huì)顯示在這個(gè)視圖中。所以,我們需要通過點(diǎn)擊View Mode工具條上中間的圖標(biāo)來改變列表視圖。改變后,應(yīng)該會(huì)顯示如下的樣子:

下一個(gè)窗口是設(shè)計(jì)界面。也就是,我們實(shí)際拖拽Cocoa Touch控件來設(shè)計(jì)我們界面的地方:

當(dāng)然,由于我們尚未添加任何控件到上面,所以現(xiàn)在還是一片空白。

下一個(gè)窗口是Library。Library包含了所有能在設(shè)計(jì)界面上使用的Cocoa Touch控件。如果你運(yùn)行Leopard【譯者注:原文這里為Snow Leopard,實(shí)際是錯(cuò)誤的?!浚敲茨愕目丶?kù)窗口如下所示:

如果你運(yùn)行Snow Leopard【譯者注:原文這里未Leopard,實(shí)際是錯(cuò)誤的?!?,它應(yīng)該是這個(gè)樣子:

注意它們兩者還是非常類似的。在Snow Leopard里,有一個(gè)名為“Classes”的標(biāo)簽頁(yè),我們后面會(huì)講到這個(gè)東西,不過這也是唯一的不同點(diǎn)。

這是Library的默認(rèn)視圖,不過我喜歡稍微不同的樣子,以便我能一下看到更多的控件。為了改變Library窗口中的視圖,右鍵點(diǎn)擊控件視圖,可以選擇不同的顯示風(fēng)格。你也可以點(diǎn)擊窗口左下角的Gear(齒輪)按鈕。下圖是Leopard中的“icons and labels”風(fēng)格:

而在Snow Leopard中是:

最后一個(gè)窗口是Inspector Window:

Inspector具有四種不同的視圖,可以通過窗口頂部的標(biāo)簽欄來選擇。這些視圖分別是Attribute Inspector、Connections Inspector、Size Inspector和Identity Inspector。Inspector大致和Visual Studio中的Property Explorer類似。它向你顯示當(dāng)前選中的Cocoa Touch對(duì)象的所有屬性。也可以用它來設(shè)置可視化屬性、布局等等。在創(chuàng)建Outlets和Actions時(shí)也用得著它,這個(gè)主題后面會(huì)談到。在下面的圖片中,我們?cè)贒ocument窗口中選擇了Window對(duì)象,所以我們可以查看這個(gè)對(duì)象的相關(guān)屬性。

現(xiàn)在,我們對(duì)Interface Builder窗口已經(jīng)大致瀏覽了一遍,接下來讓我們實(shí)際地創(chuàng)建一些東西。我們要?jiǎng)?chuàng)建如下這樣的界面:

首先,拖一個(gè)“Round Rect Button(圓角矩形按鈕)”(UIButton)到窗口上。接著,在按鈕上雙擊來設(shè)置文本。在這個(gè)過程中你會(huì)注意到,你會(huì)獲得少許的指導(dǎo)。這些指導(dǎo)是基于蘋果的人機(jī)交互向?qū)?Human Interface Guidelines)的,來輔助你在視圖上以適合的間距等來定位控件。

在窗口上添加了按鈕后,拖入一個(gè)“Label(標(biāo)簽)”(UILabel)控件。改變它的尺寸以便接近窗口的寬度。接著雙擊這個(gè)label控件,刪除文本以使應(yīng)用程序啟動(dòng)的時(shí)候,標(biāo)簽的內(nèi)容是空白的。

如果你正確地完成了所有步驟,那么你的Document Window將顯示如下的樣子(點(diǎn)擊“Window”旁邊的箭頭就會(huì)看到它包含的子控件):

我們現(xiàn)在創(chuàng)建了第一個(gè)窗口界面。不過,不像傳統(tǒng)的.NET GUI開發(fā),你還不能編程訪問這些控件。假如這是一個(gè)WPF應(yīng)用程序,你一拖動(dòng)控件到設(shè)計(jì)界面上,你就能通過this.ControlName這樣的形式來訪問它。如果你馬上去查看MainWindow.designer.cs文件,除了“window”屬性外,你看不到任何其他代碼。為了讓這些對(duì)象能被代碼訪問,我們必須通過Outlets把它們關(guān)聯(lián)上。你在Interface Builder中創(chuàng)建一個(gè)Outlet(對(duì)象關(guān)聯(lián)口)的時(shí)候,MonoDevelop將在這個(gè)類的designer.cs文件中添加一個(gè)匹配的屬性,讓你可以編程訪問這些控件。

Outlets(對(duì)象關(guān)聯(lián)口)

我們來為之前添加的標(biāo)簽和按鈕控件添加outlets,以便能在代碼中訪問它們。這點(diǎn)在Leopard和Snow Leopard上也有所區(qū)別,所以大家要嚴(yán)格遵循這里提到的正確指示。

【SNOW LEOPARD指示開始】

確保Library Window是打開的。點(diǎn)擊頂部的“Classes”標(biāo)簽。點(diǎn)擊第一個(gè)下拉列表框,這個(gè)就是所謂的“Library”,滾動(dòng)到最后選擇“Other Classes”。就會(huì)顯示在你的項(xiàng)目中存在的自定義類。從上面列表中選擇AppDelegate,接著選擇下面的“Outlets”標(biāo)簽:

點(diǎn)擊“+”按鈕兩次來創(chuàng)建兩個(gè)新的Outlet。

【SNOW LEOPARD指示結(jié)束】

【LEOPARD指示開始】

首先,保證在Document Window中App Delegate是被選中的。如果App Delegate未被選中,那么在創(chuàng)建Outlets的時(shí)候,它們的屬性不會(huì)被創(chuàng)建,或者會(huì)在錯(cuò)誤的地方創(chuàng)建。

接下來,來看Identity Inspector。Identity Inspector是Inspector窗口的最后一個(gè)標(biāo)簽頁(yè)?,F(xiàn)在,在Identity Inspector中定位到“Class Outlets”部分。在Class Outlets上,點(diǎn)擊“+”按鈕兩次來創(chuàng)建兩個(gè)新的Outlet。

【LEOPARD指示結(jié)束】

每個(gè)outlet都具有一個(gè)名稱和一個(gè)類型。名稱代表了控件屬性的名字,這個(gè)類似于ASP.NET的ID,或WPF中的Name。類型是 Outlet的實(shí)際類型,比如UIButton、UILabel、UITextView等等。為了命名它們,在它們的名稱上雙擊,鍵入相應(yīng)的名稱。對(duì)于我們之前添加的outlet來說,我們修改為“btnClickMe”和“lblResult”。

目前,它們兩者的類型都是“id”。如果你不改變類型,就能把它們掛接到任何東西上,因?yàn)閕d就意味著動(dòng)態(tài)類型,本質(zhì)上就是.NET世界中的 “object”。id類型雖然好,不過我們打算把它們改為實(shí)際的類型。過一會(huì)我們會(huì)看到這樣做會(huì)有什么不同。現(xiàn)在,雙擊btnClickMe的類型,鍵入“UIButton”。你的Class Outlets 窗口應(yīng)該顯示如下這個(gè)樣子:

如果在里面沒有window的outlet,意味著你沒有在App Delegate創(chuàng)建outlet。如果這樣的話,刪除Outlets,保證在Document Window中選中App Delegate,重新創(chuàng)建outlets。

現(xiàn)在我們已經(jīng)創(chuàng)建了這些outlets了,就需要實(shí)際地把它們關(guān)聯(lián)到我們的控件上。首先,在Inspector窗口上點(diǎn)擊第二個(gè)標(biāo)簽頁(yè),來選中 Connections Inspector。在Outlets部分,應(yīng)該可以看到我們之前創(chuàng)建的兩個(gè)Outlets了。然而,你不能把它掛接到任何東西上。注意,“window”這個(gè)outlet已經(jīng)掛接到“Window”對(duì)象上了。

為了掛接我們的Outlets,我們要從“Outlets”中的outlet圓點(diǎn)上,拖動(dòng)到我們想要掛接的控件上。在這樣做的時(shí)候,我們將會(huì)看到如下所示的效果:

對(duì)兩個(gè)Outlet都進(jìn)行這樣處理。你也可以從Connections Inspector拖到Document Window上。如果控件相互重疊的情況下,這樣就很有用。下面的截圖就描述了這種方式:

在我們這樣做的時(shí)候,你可能會(huì)注意到一些有趣的事情。因?yàn)樵O(shè)置lblResult的類型為UILabel,所以在我們把它的 Outlet拖到Window的時(shí)候,它只允許我們掛接到那些類型一致的控件上,在這個(gè)例子中就是UILabel。另外一方面,btnClickMe能被拖到任何東西上,因?yàn)樗哂袆?dòng)態(tài)的ID類型。這就是我們要設(shè)置強(qiáng)類型outlet的一個(gè)原因,以便降低它掛接到錯(cuò)誤控件上的可能性。當(dāng)然,這不是必須的,不過這樣做是一個(gè)良好的習(xí)慣。

好的,現(xiàn)在我們創(chuàng)建好了界面了,outlets也掛接好了,讓我們回到MonoDevelop把一起串在一起。

回到MonoDevelop

如果你打開MainWindow.designer.cs,在其中會(huì)到兩個(gè)屬性:

  1. [MonoTouch.Foundation.Connect("btnClickMe")] 
  2.  
  3. private MonoTouch.UIKit.UIButton btnClickMe { 
  4.     get { 
  5.         return ((MonoTouch.UIKit.UIButton)(this.GetNativeField("btnClickMe"))); 
  6.     } 
  7.     set { 
  8.         this.SetNativeField("btnClickMe", value); 
  9.     } 
  10.  
  11. [MonoTouch.Foundation.Connect("lblResult")] 
  12.  
  13. private MonoTouch.UIKit.UILabel lblResult { 
  14.     get { 
  15.         return ((MonoTouch.UIKit.UILabel)(this.GetNativeField("lblResult"))); 
  16.     } 
  17.  
  18.     set { 
  19.         this.SetNativeField("lblResult", value); 
  20.     } 
  21. }    

 

有了這兩個(gè)屬性,就可以讓我們通過代碼來訪問標(biāo)簽和按鈕了。在這里要注意一件有趣的事情——就算我們聲明btnClickMe的類型為 id,而自動(dòng)創(chuàng)建出來的屬性也是強(qiáng)類型的UIButton。這是因?yàn)镸onoDevelop足夠智能,可以查看outlet背后實(shí)際的類型,以便創(chuàng)建適合類型的屬性。這對(duì)于我們很有用,因?yàn)橐馕吨覀冊(cè)诿看问褂盟臅r(shí)候,都無(wú)需把btnClickMe屬性轉(zhuǎn)換為UIButton類型。

現(xiàn)在回到Main.cs文件,查看AppDelegate。我們來看一下FinishedLaunching方法。

  1. // This method is invoked when the application has loaded its UI and its ready to run 
  2.  
  3. public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
  4.     // If you have defined a view, add it here: 
  5.     // window.AddSubview (navigationController.View); 
  6.      
  7.     window.MakeKeyAndVisible (); 
  8.  
  9.     return true

 

正如注釋所建議的,這個(gè)方法在Application實(shí)例化后且已經(jīng)準(zhǔn)備好運(yùn)行之時(shí),由Objective-C運(yùn)行時(shí)來調(diào)用。第一句(window.AddSubview)被注釋掉了,我們會(huì)在談?wù)揗odel View Controller(MVC)模式的時(shí)候來研究它的真正作用。

下一句window.MakeKeyAndVisible,設(shè)置MainWindow為主窗口并讓其顯示出來。在 iPhone開發(fā)中,真正有意思的事情是你永遠(yuǎn)有且有一個(gè)窗口在顯示。如果想在iPhone應(yīng)用程序中顯示不同的界面,你要?jiǎng)?chuàng)建新的視圖,并用視圖控制器把其“推”到前端。然而,你不調(diào)用這個(gè)方法,iPhone OS就不會(huì)發(fā)送事件到你的窗口上。MakeKey這個(gè)部分是真正起作用的,而AndVisible部分實(shí)際上留有傳統(tǒng)OS X Cocoa框架的痕跡。

我們來添加一些新代碼到這個(gè)文件中。在我們創(chuàng)建Outlets的時(shí)候,我們是在AppDelegate中創(chuàng)建它們的。那意味著它們會(huì)出現(xiàn)在 AppDelegate類中,所以可以在這里來訪問它們。和傳統(tǒng)的.NET GUI編程有一點(diǎn)不同的是,通常會(huì)有一個(gè)MainWindow.cs文件,在那里面來處理所有窗口相關(guān)的代碼。而在這里,我們遵循Objective-C 的模式,就把代碼放在AppDelegate中。

我們來把AppDelegate類改為如下這樣子:

  1. // The name AppDelegate is referenced in the MainWindow.xib file. 
  2.  
  3. public partial class AppDelegate : UIApplicationDelegate 
  4.  
  5.     //---- number of times we've clicked 
  6.     protected int _numberOfClicks; 
  7.  
  8.     // This method is invoked when the application has loaded its UI and its ready to run 
  9.     public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
  10.     { 
  11.         // If you have defined a view, add it here: 
  12.         // window.AddSubview (navigationController.View); 
  13.  
  14.         window.MakeKeyAndVisible (); 
  15.          
  16.         //---- wire up our event handler 
  17.         this.btnClickMe.TouchDown += BtnClickMeTouchDown; 
  18.  
  19.         return true
  20.     } 
  21.  
  22.     protected void BtnClickMeTouchDown (object sender, EventArgs e) 
  23.     { 
  24.         //---- increment our counter 
  25.         this._numberOfClicks++; 
  26.         //---- update our label 
  27.         this.lblResult.Text = "Hello World, [" + this._numberOfClicks.ToString () + "] times"
  28.     } 
  29.  
  30.     // This method is required in iPhoneOS 3.0 
  31.     public override void OnActivated (UIApplication application) 
  32.     { 
  33.     } 

 

第一件事情,我們添加了一個(gè)變量來跟蹤點(diǎn)擊次數(shù), _numberOfClicks。接著,我們添加這行代碼:this.btnClickMe.TouchDown += BtnClickMeTouchDown;

這就把btnClickMe的TouchDown事件(類似于OnClick)掛接到處理程序BtnClickMeTouchDown上

接著,在BtnClickMeTouchDown中,我們簡(jiǎn)單地用按鈕被點(diǎn)擊多少次的數(shù)量值來更新標(biāo)簽的顯示內(nèi)容。

好了,我們已經(jīng)完成了所有編程,讓我們來構(gòu)建和運(yùn)行一下。首先來構(gòu)建。在菜單中,選擇Build : Build All。如果目前為止你都正確的按部就班的話,它應(yīng)該能構(gòu)建成功。下一步,就是在iPhone模擬器上運(yùn)行它。在工具欄上,確保 debug|iPhoneSimulator被選中,如圖:

接著,在菜單中選擇Run : Run。在MonoTouch的評(píng)估版中,你只能在模擬器中運(yùn)行,如果你打算在iPhone中運(yùn)行,你會(huì)得到一個(gè)錯(cuò)誤。

如果一切正常,模擬器會(huì)顯示出來(實(shí)際上,它有可能隱藏在MonoDevelop窗口的背后,所以你需要切換過去),那么你就能看到如下所示的效果:

點(diǎn)擊按鈕將會(huì)產(chǎn)生下圖的結(jié)果:

恭喜你!你已經(jīng)創(chuàng)建并跑起你的第一個(gè)iPhone應(yīng)用程序了。

Actions(動(dòng)作)

在我們剛剛創(chuàng)建的應(yīng)用程序中,我們有一些Outlets,在代碼中可以藉由屬性來訪問控件。就像在其他.NET GUI模型中,我們能把事件處理程序掛接到它們之上,來對(duì)事件作出響應(yīng)。不過MonoTouch提供了另外一種響應(yīng)用戶輸入的方式。這稱之為 Actions。Actions類似于WPF的Commands,用這種方式,多個(gè)控件可以調(diào)用同一個(gè)方法,然后依據(jù)調(diào)用者是誰(shuí)來決定如何去處理。讓我們來稍微仔細(xì)地研究一下。確保你已經(jīng)在MonoDevelop打開了Example_HelloWorld_1應(yīng)用程序了。

雙擊MainWindow.xib文件來在Interface Builder中打開它?,F(xiàn)在在標(biāo)簽控件下面添加兩個(gè)按鈕,類似下圖:

再次,我們要針對(duì)Leopard和Snow Leopard作出不同的說明,你要確定按照正確的部分進(jìn)行操作。

【SNOW LEOPARD指示開始】

在Library窗口中,確保選中“Classes”標(biāo)簽頁(yè),并再次在頂部的下拉列表框中選擇“Other Classes”。接著,在上面選擇AppDelegate,在下面選擇“Actions”標(biāo)簽頁(yè)。創(chuàng)建一個(gè)名為ActionButtonClick的 Action。你的Library窗口應(yīng)該看起來如下所示:

【SNOW LEOPARD指示結(jié)束】

【LEOPARD指示開始】

在窗口管理器中,確保選中App Delegate 。接著在Identity Inspector窗口中,在“Class Actions”里面創(chuàng)建一個(gè)名為ActionButtonClick的Action。你的Identity Inspector應(yīng)該看起來如下所示:

【LEOPARD指示結(jié)束】

我們剛剛在App Delegate上創(chuàng)建好了一個(gè)名為ActionButtonClick的通用動(dòng)作?,F(xiàn)在,要做的就是把它關(guān)聯(lián)到按鈕的 TouchDown事件上,以便在按鈕被點(diǎn)擊的時(shí)候,這個(gè)Action能被調(diào)用。

首先,選擇一個(gè)動(dòng)作按鈕,接著轉(zhuǎn)到Connections Inspector,把Touch Down拖動(dòng)Document窗口中的App Delegate。如下圖所示:

注意,在我們拖到App Delegate的時(shí)候,會(huì)顯示出一個(gè)可用Actions的列表。選擇ActionButtonClick,現(xiàn)在按鈕上的TouchDown事件就關(guān)聯(lián)到這個(gè)動(dòng)作上了:

為兩個(gè)動(dòng)作按鈕都進(jìn)行同樣的操作。如果我們?cè)贑onnections Inspector中查看App Delegate,會(huì)這樣顯示:

通過點(diǎn)擊“Multiple”旁邊的箭頭,可展開和ActionButtonClick相關(guān)的控件。保存好.xib文件后,回到 MonoDevelop中。

如果我們看一下MainWindow.designer.cs,會(huì)發(fā)現(xiàn)多了一行新代碼:

  1. [MonoTouch.Foundation.Export("ActionButtonClick")] 
  2. partial void ActionButtonClick (MonoTouch.UIKit.UIButton sender); 

這是我們的Action的分部聲明。注意它用MonoTouch.Foundation.Export特性標(biāo)記進(jìn)行了裝飾。這使 Objective-C運(yùn)行時(shí)可以找到關(guān)聯(lián)到我們Action上的適當(dāng)方法。編譯器實(shí)際上會(huì)忽略沒有任何實(shí)現(xiàn)的分部方法(正如我們?cè)谶@里所見的這個(gè)),那么這個(gè)分部方法的聲明實(shí)際上是為了在實(shí)現(xiàn)它的時(shí)候可以獲得代碼完成的功能。如果我們回到Main.cs,會(huì)看到它的真正作用。在AppDelegate類中,只要鍵入“partial”就會(huì)自動(dòng)地得到ActionButtonClick的自動(dòng)完成代碼:

我們把如下代碼寫在里面:

 

  1. partial void ActionButtonClick (UIButton sender) 
  2.  
  3.     //---- show which button was clicked 
  4.     this.lblResult.Text = sender.CurrentTitle + " Clicked"

 

現(xiàn)在,如果你運(yùn)行應(yīng)用程序,在動(dòng)作按鈕上點(diǎn)擊,將會(huì)看到如下所示的效果:

此時(shí),我們已經(jīng)完整地經(jīng)歷了用MonoTouch來開發(fā)基本iPhone應(yīng)用程序的過程。現(xiàn)在,你應(yīng)該對(duì)MonoTouch應(yīng)用程序的結(jié)構(gòu)、利用事件處理用戶交互,以及用Actions來處理用戶交互有了基本的了解。

責(zé)任編輯:佚名 來源: infoQ
相關(guān)推薦

2011-07-18 10:21:04

iOS Visual Stu iphone

2012-02-13 14:22:22

MonoTouchiOS應(yīng)用Visual Stud

2012-02-13 14:10:11

MonoTouchiOS應(yīng)用Visual Stud

2011-07-18 10:00:47

iPhone iOS Visual Stu

2012-02-13 10:14:10

MonoTouchObjective-C

2012-03-15 15:35:51

iUI框架EclipseiOS Web

2015-03-30 12:13:23

React NativiOS

2011-05-11 10:02:37

iOS

2009-09-21 09:27:58

MonoTouch

2012-05-13 12:43:50

iOS

2012-05-02 23:04:38

iOS

2011-04-19 10:38:53

Xcode 4MacRubyiOS

2012-03-09 13:52:28

Adob??e AIRiOS

2010-01-13 14:26:39

VB.NET開發(fā)

2019-05-05 11:02:07

vscodevue前端

2013-09-13 13:16:05

2011-07-08 14:58:16

iPhone Xcode iOS

2011-08-11 16:50:04

iOSTwitter

2011-08-17 14:30:34

iOS開發(fā)窗口

2012-02-02 10:14:14

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)