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#のみで完結したコードをテキストエディタだけで開発できます.
