在Visual Studio中使用MonoTouch開發iOS應用:開發體驗

來源:互聯網
上載者:User

建立項目

根據我的個人習慣,我會先建立一個空白的解決方案。首先在Mac OS X中開啟MonoDevelop,然後在菜單中選擇File - New- Solution,在彈出對話方塊的Other分類中選擇Blank Solution模板,並填寫合適的位置和名稱:

然後便是建立iPhone應用程式項目。還是剛才的對話方塊,選擇C#- iPhone and iPad分類下的iPhone Window-based Project模板。同樣,在對話方塊下方填寫合適的位置和名稱,我的習慣是將所有的原始碼統一放在src目錄下(在解決方案中也會建立一個src目錄與之對應):

點擊OK。下一步是額外的項目配置,可以直接點擊OK。此時我們就會發現MonoDevelop裡展示出的專案檔:

其中Main.cs裡包含了項目的啟動代碼及一個AppDelegate類,MainWindow.xib是主視窗的介面檔案,而 MainWindow.xib.designer.cs檔案則是MonoDevelop根據xib檔案中的標記所自動建立的C#代碼,在絕大部分情況下我們不會去修改它。

編輯介面

雙擊MainWindow.xib檔案,便會開啟Interface Builder。左為Library視窗(近似於VS中的Toolbox);中間上方是可視化的UI編輯器,下方則是對象管理器,顯示了介面中定義的對象;右側便是用來修改屬性的Inspector視窗(近似於VS中的Properties視窗):

首先,在Library視窗上方選擇Objects,並將一個Round Rect Button拖動至UI編輯器,雙擊,輸入Hello World:

然後,在Library視窗上方選擇Classes,在上方列表中選擇AppDelegate,並在下方下拉框中選取Outlets,並使用下方加號添加一個id,叫做ButtonCounter:

接著便是個比較有趣的操作。在對象管理器裡選中App Delegate對象,並在Inspector上方選擇Connections,再將ButtonCounter右側的小圓點拖動至按鈕,這會將ButtonCounter這個id與按鈕關聯起來,如:

在Interface Builder中儲存,回到MonoDevelop,開啟MainWindow.xib.designer.cs檔案,便可以看到其中在AppDelegate中產生的ButtonCounter屬性:

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

可見,MonoDevelop根據xib的內容,自動產生了一些C#代碼。AppDelegate是個Partial Class,它的另一部分在Main.cs檔案中,一會兒我們便會使用這裡的ButtonCounter定義。

配置Visual Studio 雖然MonoDevelop的sln和csproj檔案的格式與Visual Studio相容(包括2005、2008、2010三個版本的VS),但是VS無法識別iPhone應用程式的項目模板,因此如果您直接開啟 iOS101.sln則會載入失敗。因此,我們需要並行地建立一些sln和csproj,其中大部分內容與MonoDevelop建立的內容保持同步。

例如,我建立了iOS101.VS.sln及iPhoneApp.UI.VS.csproj(一個.NET 2.0的Class Library)兩個檔案,它們分別與iOS101.sln和iPhoneApp.UI.csproj放在同樣的目錄下。值得注意的是 iPhoneApp.UI.VS.csproj檔案,如果您直接在VS裡建立這個專案檔,它的預設命名空間裡也會包含“VS”,您可能需要手動修改一下。由於要和MonoDevelop中的項目保持一致的“可編譯通過性”,我們還需要引用MonoTouch SDK裡提供的dll。於是我在iOS101目錄中建立了lib/monotouch目錄,並使用如下命令複製所有的MonoTouch提供的dll檔案:

cp /Developer/MonoTouch/usr/lib/mono/2.1/*.dll ~/Projects/iOS101/lib/monotouch然後,編輯iPhoneApp.UI.VS.csproj的程式集引用和專案檔,最終結果差不多是這樣的。請注意MonoTouch中xib檔案的類型為Page,而VS中則需要設為None:

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <Project ...> ... 
  3. <ItemGroup> 
  4. <Reference Include="monotouch"> 
  5. <HintPath>..\..\lib\monotouch\monotouch.dll</HintPath> 
  6. </Reference> 
  7. <Reference Include="System"> 
  8. <HintPath>..\..\lib\monotouch\System.dll</HintPath> 
  9. </Reference> 
  10. <Reference Include="System.Core"> 
  11. <HintPath>..\..\lib\monotouch\System.Core.dll</HintPath> 
  12. </Reference> 
  13. </ItemGroup> 
  14. <ItemGroup> 
  15. <None Include="Info.plist" 
  16. /> 
  17. <Compile Include="Main.cs" 
  18. /> 
  19. <None Include="MainWindow.xib" 
  20. /> 
  21. <Compile Include="MainWindow.xib.designer.cs"> 
  22. <DependentUpon>MainWindow.xib</DependentUpon> 
  23. </Compile> 
  24. </ItemGroup> 
  25. ...</Project> 

在VS的結果則類似於:

試著編譯一下,通過則表示配置成功。

編寫代碼

這裡您是否有些疑惑,為什麼上面建立的是一個.NET 2.0項目呢?這樣我們還能夠使用C# 3.0中的進階特性嗎?答案是肯定的,只要我們使用的是Visual Studio 2008或是2010,則即使是針對.NET 2.0所編寫的代碼,VS也會使用C# 3.0的編譯器,因為我們都知道其實C# 3.0隻需要一點點架構和類庫的支援(擴充方法)。您甚至可以使用C# 4.0的部分特性,例如參數的預設值,具名引數等等。可惜您無法使用C# 4.0的動態性,因為它需要DLR和Microsoft.CSharp.dll,又涉及到大量的動態代碼產生,我對此沒什麼信心和意願。當然您感興趣的話也可以嘗試一下。

我在這裡使用.NET 2.0的原因,是希望可以儘可能減少對系統程式集的依賴,而盡量使用MonoTouch所提供的dll。例如現在,除了mscorlib以外,所有的程式集都與Windows上所安裝的.NET Framework無關,這保證了我們編寫的代碼可以在MonoTouch相容。

現在就來開始編寫代碼吧,您可以在VS裡開啟Main.cs,在AppDelegate的FinishedLaunching方法中添加如下代碼,使之成為:

 
  1. public 
  2.  
  3. override 
  4.  
  5. bool FinishedLaunching(UIApplication app, NSDictionary options){ 
  6.  
  7. int i = 
  8.  
  9. 0; 
  10.  
  11. this.ButtonCounter.TouchDown += 
  12.  
  13. delegate 
  14.  
  15.  
  16. this.ButtonCounter.SetTitle((++i).ToString(), UIControlState.Normal); 
  17.  
  18. }; 
  19.  
  20. window.MakeKeyAndVisible(); 
  21.  
  22. return 
  23.  
  24. true;} 

FinishedLaunching方法在程式啟動時調用,此時我們為ButtonCounter添加一個TouchDown事件(類似於Click)添加一個處理函數。這裡用到了C#中的匿名函數特性,並捕獲外部的變數i,每次點擊按鈕都將i加一,並顯示在按鈕上。在這裡我們使用.NET中比較常用方式添加事件處理,事實上您也可以在Interface Builder中定義一個Action,並把它與Button的TouchDown事件關聯起來。這個Action會表現為一個Partial Method,您可以在代碼裡補全其實現。

儲存代碼後您便可以回到MonoDevelop中,為了能夠在iPhone模擬器裡運行,您還要修改一個參數。對iPhoneApp.UI點擊右鍵,開啟 Options對話方塊,在左側選中Build - iPhone Build類別,並將右側的SDK version設為4.0,如下:

點擊OK儲存並關閉對話方塊。此時可以選擇菜單Run - Run,或直接使用快速鍵Command(即Win鍵)+ Alt + Enter便會編譯項目,並開啟模擬器執行程式。在預設情況可能開啟的iPad模擬器,您可以在Hardware - Device中選擇iPhone或iPhone 4。運行效果如下:

試著點擊按鈕查看效果吧。

單元測試及其他

如果您想調試代碼,只需要在MonoDevelop中設定端點,並選擇菜單Run - Debug,或直接使用快速鍵Command + Enter便可以對模擬器進行調試。但是如果是要單元測試呢?這問題也不大,MonoDevelop內建NUnit項目,您可以建立這樣一個單元測試項目,刪除其預設引用,換之為MonoTouch SDK裡所提供的程式集,同樣您可以在Visual Studio中開發單元測試代碼,但是調試執行必須在MonoDevelop裡進行,因為MonoTouch提供的程式集都是Mac下的Mono實現,它們在Windows下的作用只是為Visual Studio提供必要的中繼資料,使我們能夠享受到智能提示之類的便利,想要在Windows裡運行則是不行的。

但是,事實上我們也可以將Visual Studio裡面的項目定義為.NET Framework 3.5項目,並直接使用.NET提供的程式集,對於MonoTouch裡額外的程式集,例如System.Json.dll,則面向.NET 3.5自己重新構建一遍即可(原始碼可以使用.NET Reflector獲得或是利用Mono上的開原始碼)。這麼做的優勢在於,對於那些與MonoTouch無關的代碼,我們都可以在Visual Studio裡進行調試與測試了。於是乎,我們可以在代碼開發階段儘可能留在熟悉而強大的環境中,對開發效率有很大協助。

這種做法也有缺點,例如,雖然MonoTouch提供的類庫與.NET 3.5相容,但事實上我並不能百分之百保證這點,因此在.NET 3.5裡可以編譯通過的代碼,也有可能無法在MonoTouch裡編譯執行。此外,這種方法也會讓您無法使用Mono程式集中對.NET的擴充(主要是 Mono命名空間下的類庫)。不過這兩個理論上問題到目前為止還沒有給我造成什麼困擾,我也只有在需要在查看模擬器運行效果時才回到Mac及 MonoDevelop中。

有些朋友看到System.Json可能會有些熟悉,因為它在Silverlight開發中也有出現。您說的沒錯,事實上MonoTouch裡的程式集版本號碼與Silverlight一樣,都是2.0.5.0,甚至連強簽名都是一致的。只可惜Silverlight裡的類庫是.NET 3.5的子集,例如所有同步的IO操作都被去除了,因此我們很難使用Silverlight來開發MonoTouch程式。當然,有了 Silverlight,對我們開發MonoTouch也是有所協助的,這點以後再談。

最後,您應該已經意識到,我們需要在VS的專案檔與MonoDevelop的專案檔直接做同步,這個同步包括程式集引用與代碼檔案兩方面。如果您覺得手動編輯比較麻煩的話,就寫一個自動同步的小程式咯——不會?那麼還是先別搞MonoTouch了,從編程基礎學起吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.