前回「Xamarin+MvvmCrossでAndroidもデータバィンディング」という記事でXamarin+mvvmcrossでAndroidアプリ作成にデータバインディングを用いる方法を紹介しました。
今回はiPhoneで同じようにデータバインディングを利用する方法を紹介します。
最初に書いておきますが、iPhoneでデータバインディングを用いる場合はStroryBoardが使えず、C#コードでバインドする形になります。ちょっと期待した方法では無いかな。
(Visual StudioでiPhoneプロジェクトを作成する場合ビューにStoryBoardがまだ使えないところとも関係しているのでしょうかMac上でXamarin Studioを用いて開発すると使えるのですが)
本記事はN plus 1 Videos Of MvvmCrossの動画を元に最低限の実装で動作を確認できるように紹介します。
ここは「Xamarin+MvvmCrossでAndroidもデータバィンディング」で、紹介したものと同様のPCLを作成します。
なのでPCLの作成は上記エントリを参考にしてください。
続いて、同じソリューションにiPhoneのプロジェクトを追加します。
追加の要領はAndroidと同様で、ソリューションエクスプローラーのソリューション名の上あたりで右クリック。
追加→新しいプロジェクトをクリックします。
「新しいプロジェクトの追加」ポップアップの左ナビではVisual C#→iOS→iPhoneを選択。
プロジェクトはHelloWorld Applicationを選択します。
名前はプロジェクト名がDemoの場合ならDemo.Touchとしておきます(任意)。
プロジェクトが作成されたらNuGetでNuGetからMvvm Cross Hot Tuna Starter Packをインストールします。
参照の追加からPCLを追加します。
(この辺もAndroidと同じですね)
続いて「ToDo-MvvmCross」フォルダの中のテキストを参考にAppDelegate.csを以下のように書き換えます。
using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using Cirrious.MvvmCross.ViewModels;
using Cirrious.CrossCore;
using Cirrious.MvvmCross.Touch.Platform;
namespace SecondDemo.Touch
{
[Register("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
UIWindow _window;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
_window = new UIWindow(UIScreen.MainScreen.Bounds);
var setup = new Setup(this, _window);
setup.Initialize();
var startup = Mvx.Resolve<IMvxAppStart>();
startup.Start();
_window.MakeKeyAndVisible();
return true;
}
}
}
デバッグはMac上で起動しておいたホストアプリにアプリのパッケージをリモート転送して行います。
なのでiPhoneアプリのデバッグをするにはMacが必要になります。
MacにXamarinをインストールすると、Xamarin.iOS Build Hostというホストアプリが利用可能になるので、それを起動します。
Mac上のホストに接続せずに、Visual Studio上でデバッグ実行しようとすると以下のようにエラーがでます。
このエラーをダブルクリックするとサーバー接続設定を行うことができます。
このように接続可能なホストアプリが表示されたら接続します。
最初はMac側で表示されているPINを入力する必要があります。
うまく動かない場合はデバッグの対象が「iphoneSimulator」になっているか? や、MacとWindowsのXamarinのバージョンが異ならないか? などをチェックしてみましょう。
デバッグすると下画像のような画面が表示されます。
上の文字は下の文字とバインドされており、下の文字を変更すると上の文字も合わせて変化します。
データバインディングしているコードは以下のような感じです。
var label = new UILabel(new RectangleF(10, 10, 300, 40));
Add(label);
var textField = new UITextField(new RectangleF(10, 50, 300, 40));
Add(textField);
var set = this.CreateBindingSet<FirstView, SecondDemo.core.ViewModels.FirstViewModel>();
set.Bind(label).To(vm => vm.Hello);
set.Bind(textField).To(vm => vm.Hello);
set.Apply();
コードでやっちゃってます。
以上、iPhoneでデータバインディングする方法の紹介でした。
Please give us your valuable comment