細談visual studio使用mono touch開發iOS應用程序--my note

   linux程序員使用mono develope也能夠開發net平臺的工程項目,可是使用visual studio也能夠開發iOS應用程序,咱們先在Mac OS X上安裝了MonoTouch開發環境,並已經可以在Mac OS X和Windows之間共享文件。如今咱們就能夠來簡單體驗一下,如何使用Visual Studio,Interface Builder以及少許的MonoDevelop來開發一個最最簡單的iOS應用程序。 linux

   start項目, 程序員

先建立一個空白的解決方案。首先在Mac OS X中打開MonoDevelop,而後在菜單中選擇File - New - Solution,在彈出對話框的Other分類中選擇Blank Solution模板,並填寫合適的位置和名稱: 小程序

而後即是建立iPhone應用程序項目。仍是剛纔的對話框,選擇C# - iPhone and iPad分類下的iPhone Window-based Project模板。一樣,在對話框下方填寫合適的位置和名稱,個人習慣是將全部的源代碼統一放在src目錄下(在解決方案中也會建立一個src目錄與之對應): app

點擊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窗口): ide

首先,在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屬性:

private MonoTouch.UIKit.UIButton __mt_ButtonCounter;

[MonoTouch.Foundation.Connect("ButtonCounter")] private MonoTouch.UIKit.UIButton ButtonCounter { get { this.__mt_ButtonCounter = ((MonoTouch.UIKit.UIButton)(this.GetNativeField("ButtonCounter"))); return this.__mt_ButtonCounter;
    } set { this.__mt_ButtonCounter = value; this.SetNativeField("ButtonCounter", value);
    }
}

可見,MonoDevelop根據xib的內容,自動生成了一些C#代碼。AppDelegate是個Partial Class,它的另外一部分在Main.cs文件中,一下子咱們便會使用這裏的ButtonCounter定義。

配置Visual Studio

雖然MonoDevelop的sln和csproj文件的格式與Visual Studio兼容(包括200五、200八、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:

<?xml version="1.0" encoding="utf-8"?> <Project ...> ... <ItemGroup> <Reference Include="monotouch"> <HintPath>..\..\lib\monotouch\monotouch.dll</HintPath> </Reference> <Reference Include="System"> <HintPath>..\..\lib\monotouch\System.dll</HintPath> </Reference> <Reference Include="System.Core"> <HintPath>..\..\lib\monotouch\System.Core.dll</HintPath> </Reference> </ItemGroup> <ItemGroup> <None Include="Info.plist" /> <Compile Include="Main.cs" /> <None Include="MainWindow.xib" /> <Compile Include="MainWindow.xib.designer.cs"> <DependentUpon>MainWindow.xib</DependentUpon> </Compile> </ItemGroup> ... </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方法中添加以下代碼,使之成爲:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{ int i = 0; this.ButtonCounter.TouchDown += delegate { this.ButtonCounter.SetTitle((++i).ToString(), UIControlState.Normal);
    };

    window.MakeKeyAndVisible(); return 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也是有所幫助的,這點之後再談。

at last,您應該已經意識到,咱們須要在VS的項目文件與MonoDevelop的項目文件直接作同步,這個同步包括程序集引用與代碼文件兩方面。若是您以爲手動編輯比較麻煩的話,就寫一個自動同步的小程序咯——不會?

adiOS

相關文章
相關標籤/搜索