A C# iphone hello world sample code with no nib file
このエントリを書いてから気づきました.MonotouchのサンプルコードのHelloは,まさにソースコードだけで書かれたものでした.コードそちらを参照してください.
このエントリの価値はMonoDevelopのNIBファイル設定方法にあります.
はじめに
NIBファイルを使わないMonotouchのHello worldサンプルコードを作製しました.
MonotouchのtutorialにInterfaceBuilderを使うサンプルが掲載されています http://monotouch.net/Tutorials/MonoDevelop_HelloWorld.たしかにInterfaceBuilderによりUIを短時間に仕上げられますが,しかし実際の処理が隠蔽されて流れが想像しづらくなります.このため学習目的としてInterfaceBuilderを使わないHello worldのサンプルを作製しました.
このサンプルはErica Sadunのhello worldサンプルをC#に書き換えただけのものです.
開発環境
Mac OS Xが動作する環境に,iPhone SDK,Mono, MonoDevelop および Monotouchがインストールされていることが必要です.
開発環境のインストール詳細手順は,http://monotouch.net/Documentation/Installationにあります.
実行の流れ
iPhoneのアプリケーション実行は:
- Applicationクラスのstaticメソッド Mainから,UIApplicationDelegateのインスタンスに処理を移す
- UIApplicationDelegateはオーバライドしたFinishedLaunchingメソッドで,UIWindowとUIViewControllerのインスタンスを構築する
- ここで作られたUIViewControllerがViewに関わる処理を行う
となります.
コーディング
コードはMonoDevelopで作製していきます.
まず新規プロジェクトを作製します.ファイル → 新規 → ソリューション メニューを選択して,テンプレートから C# → iPhone MonoTouch Projectを選択します.プロジェクト名は適当でよいです.
次にデフォルトで用意されるMainWindow.xibファイルを削除します.次にプロジェクトのオプションを選択します.ここでビルド→iPhone Applicationを選択すると,Main interface fileという項目があります.ここに先ほど削除したMainWindow.nibが設定されているはずですから,これを削除します.MonoDevelop バージョン2.2 Beta 2 では,この項目を空に設定できませんでした.このため一旦MonoDevelopを終了してから,ソリューションファイル(拡張子 .csproject)をテキストエディタで開き,XMLのMainNibFile要素をコメントアウトしました.
ここまでの作業で,Main関数から自動的にNIBファイルがロードされることがなくなりました.次にUIの構築と処理の委譲を書いていきます.
コードの量が少ないため以下に示すMain.csに全てのコードを書きました.
Main.cs:
using System; using System.Collections.Generic; using System.Linq; using MonoTouch.Foundation; using System.Drawing; using MonoTouch.UIKit; namespace Sample_wo_nibfiles { public class HelloWorldViewController : UIViewController { public override void LoadView () { //base.LoadView (); var frame = UIScreen.MainScreen.ApplicationFrame; var contentView = new UIView(frame); contentView.BackgroundColor = UIColor.LightGray; var label = new UILabel(new RectangleF(0f, 0f, 320f, 30f)); label.Text = "Hello World"; label.Center = contentView.Center; label.BackgroundColor = UIColor.Clear; label.TextAlignment = UITextAlignment.Center; contentView.AddSubview(label); this.View = contentView; System.Diagnostics.Debug.WriteLine("hello world view controller loaded a view."); } } // The name AppDelegate is referenced in the MainWindow.xib file. [Register("AppDelegate")] public class AppDelegate : UIApplicationDelegate { // This method is invoked when the application has loaded its UI and its ready to run public override bool FinishedLaunching (UIApplication app, NSDictionary options) { var window = new UIWindow(UIScreen.MainScreen.Bounds); var hwvc = new HelloWorldViewController(); window.AddSubview(hwvc.View); System.Diagnostics.Debug.WriteLine("main window is loaded."); // If you have defined a view, add it here: // window.AddSubview (navigationController.View); window.MakeKeyAndVisible (); return true; } // This method is required in iPhoneOS 3.0 public override void OnActivated (UIApplication application) { } } public class Application { static void Main (string[] args) { UIApplication.Main (args,null, "AppDelegate"); } } }
まず処理はApplicationクラスのMainメソッドから開始します.ここでUIApplication.Mainメソッドを"AppDelegate"という文字列を指定して呼び出しています.
処理自体はiPhone SDKをC#で扱っているだけなので,Objective-Cのサンプルとまったく同じになります.ただし,UIApplication.Mainメソッドから,AppDelegateというクラスを探し出すために,この文字列とクラスとをAppDelegate のクラス属性 [Register("ApplicationDelegate")] で指定しておかねばなりません.
ウィンドウやViewの構築は,UIApplicationDelegateクラスのFinishedLaunchingメソッドで行います.これ以降の処理はObjective-Cのサンプルと同じですから説明を省きます.
コンパイルと実行
サンプルコード
ソリューションを含む全てのファイルをtar+gz形式で, http://cid-dc553df7ed98b57a.skydrive.live.com/self.aspx/public/Sample%5E_wo%5E_nibfiles.tar.gz に置きます.
まとめ
Monotouchを使いMonodevelopのみでhello worldを表示するサンプルコードを作成しました.
サンプルは1画面を表示するだけでしたが,適切なUIViewControllerのサブクラス,例えばUINavigationController,を使うことでViewの遷移は簡単にできます.
このサンプルのやり方を使えば,C#のみで完結したコードをテキストエディタだけで開発できます.