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