Xamarin.iOS テンプレート(Single View App)

2015.10.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 Xamarinによる3種類のアプローチ

Xamarinを利用してモバイルアプリを開発する場合、そのアプローチとして、大きく次のような3つのものがあります。

  • Xamarin.iOS
  • Xamarin.Android
  • Xamarin.Forms

上記のうち最初の2つは、名前のとおり、iOS 及び、Andorid用のアプリを作成するためのものです。 そしてそれは、それぞれのプラトフォーム固有の機能や、UIをC#で薄くラッパーしたものとなっています。

ここで、「薄くラッパー」と表現しているのは、元々のライブラリの名前空間やクラス名などを可能な限り忠実になぞり、文法、コーディング規約などをC#に合わせたものとなっている事を言っています。

このため、iOSのエンジニアであれば、「Xamarin.iOS」が、そして、Androidエンジニアであれば「Xamarin.Android」が、比較的、違和感なく読めると思います。 そして、どちらのプラットフォームにも経験が無い方でも、C#開発者であれば、ライブラリがC#であることから、極めて低いハードルで入門できるものになっています。

注) Xamarin.Formsは、前出の2つと大きく違い、まったく固有のライブラリとなっています。

今回は、Xamarin.iOSのシンプルなプロジェクトを通じて、この「薄いラッパー」を実感していただければと考えています。

2 テンプレート(Single View App)

SingleViewApp001

VisualStudioでプロジェクトを作成する際に、「Single View App(iPhone)」を選択すると下記の構造のプロジェクトが生成されます。

SingleViewApp002

(1)Main.cs

プログラム起動時のエントリーポイントとなるMain関数が定義されており、アプリケーションデリゲートにAppDelegateクラスが指定されています。

Main.cs

public class Application {
    static void Main(string[] args) {
        UIApplication.Main(args, null, "AppDelegate");
    }
}

(2)AddDelegate.cs

アプリ起動後やバックグラウンドに移動する際などの処理を記述するクラスです。 プロジェクトのテンプレートで生成されるひな形では、下記の4つのメソッドだけがオーバーライドされていますが、中身は何も定義されいません。

AddDelegate.cs

[Register("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate {
    public override UIWindow Window {
        get;
        set;
    }
     
    //アプリがアクティブでなくなる直前に呼び出される
    public override void OnResignActivation(UIApplication application) { }
    //アプリがバックグラウンドになった時、呼び出される
    public override void DidEnterBackground(UIApplication application) { }
    //アプリがバックグラウンドからフォアグラウンドになる直前に呼ばれる
    public override void WillEnterForeground(UIApplication application) { }
    //アプリがバックグラウンド中に終了されるとき呼び出される
    public override void WillTerminate(UIApplication application) { }
}

このほかのイベントを処理する場合は、メソッドをオーバーライドすることで利用可能です。

SingleViewApp003

(3)MainStoryboard.storyboard

ストーリーボードのファイルであり、Info.plistの「Main Interface」でこのファイル名が指定されているため、アプリの起動時にインスタンス化されることになります。 SingleViewApp004

ダブルクリックすると、何も乗っていないまっさらなビューが1つだけ置かれたビューコントローラーが表示されます。また、併せて「表示(V)」-「その他のウインドウ(E)」から「ドキュメント アウトライン(T)」を表示すると、その階層構造を分かりやすく確認することができます。 SingleViewApp005

一番トップとなっているViewControllerを選択してプロパティを確認すると、Classのところが「RootViewController」となっており、これが次に解説するビューコントローラーのクラスとなっています。 SingleViewApp006

(4)RootViewController.cs

ビューコントローラーのクラス定義です。 下記のメソッドが、オーバーライドされていますが、こちらも当初何も記述されていません。

RootViewController.cs

public partial class RootViewController : UIViewController {
    public RootViewController(IntPtr handle) : base(handle) {}
    
    //メモリ不足時に呼び出される
    public override void DidReceiveMemoryWarning() {
        base.DidReceiveMemoryWarning();
    }
    
    //初回ロードされた時のみ呼び出される
    public override void ViewDidLoad() {
        base.ViewDidLoad();
    }
    
    //画面が表示される都度呼び出される
    public override void ViewWillAppear(bool animated) {
        base.ViewWillAppear(animated);
    }
    
    //画面が表示された後に呼び出される
    public override void ViewDidAppear(bool animated) {
        base.ViewDidAppear(animated);
    }
    
    //画面が閉じる前に呼び出される
    public override void ViewWillDisappear(bool animated) {
        base.ViewWillDisappear(animated);
    }
    
    //画面が閉じた後に呼び出される
    public override void ViewDidDisappear(bool animated) {
        base.ViewDidDisappear(animated);
    }
}

2 UIViewだけのアプリ

(1)UIViewのクラス定義

UIViewだけの単純なアプリが、よく入門書に紹介されていますが、このUIViewは、本テンプレートにおいては、先の「ドキュメント アウトライン」で見えていた、Viewの事です。

SingleViewApp007

しかし、プロパティのClassのところが空欄になっていますので、基底クラスであるUIViewでインスタンス化され、ソースコードは無いことになります。 このClassのところにクラス名を入力すると、自動的にソースファイルが生成され、ソリューションエクスプローラに表示されるようになります。

SingleViewApp008

SingleViewApp009

(2)文字列表示

入門でよく最初に紹介されている、draw()を使用したビューへの文字列描画は、Xamarinでは次のようになります。

MyView.cs

partial class MyView : UIView {
    public MyView(IntPtr handle) : base(handle) {
    }

    public override void Draw(CGRect rect) {
        base.Draw(rect);
        var str = new NSString("Developers.IO");
        str.DrawString(new CGPoint(75, 60), UIFont.FromName("HiraKakuProN-W3", 24f));
    }
}

SingleViewApp010

まとめ

今回は、XamarinのiPhone用テンプレートから、SingleViewAppを使用した最もシンプルなアプリを作成することで、その構造を概観しました。 もし、既にObjective-CやSwiftでiOSを開発されている方でしたら、「C#である」ということを除けば、ほとんど違和感がなかったのでは無いでしょうか。

githubサンプルコード(http://github.com/furuya02/Xamarin.iOS.Samples)

参考リンク

Xamarin Developers

初めての Xamarin.iOS アプリケーション開発 - 入門ガイド

iPhoneアプリ開発の虎の巻

この辺でXamarin導入による 効果と限界をしっかり把握してみよう MVP Community Camp 2015

Xamarin記事一覧(SAPPOROWORKSの覚書)