リフレクション API を使用した Xamarin.iOS アプリケーションの作成

MT.D リフレクション API を使用すると、画面を自動的に作成するために MT.D が使用する属性でクラスを修飾できます。 リフレクション API は、これらのクラスと画面に表示される内容の間のバインドを提供します。 この API では、Elements API が行うきめ細かな制御は行われませんが、クラスの修飾に基づいて要素の階層を自動的に構築することで、複雑さが軽減されます。

MT.D の設定

MT.D は Xamarin.iOS と共に配布されます。 これを使用するには、Visual Studio 2017 または Visual Studio for Mac で Xamarin.iOS プロジェクトの [参照] ノードを右クリックし、MonoTouch.Dialog-1 アセンブリへの参照を追加します。 次に、必要に応じてソース コードに using MonoTouch.Dialog ステートメントを追加します。

リフレクション API の概要

リフレクション API の使用は、次のように簡単です。

  1. MT.D 属性で修飾されたクラスを作成します。
  2. BindingContext インスタンスを作成し、上記のクラスのインスタンスを渡します。
  3. DialogViewController を作成し、BindingContext’sRootElement を渡します。

リフレクション API の使用方法を示す例を見てみましょう。 この例では、次に示すように単純なデータ入力画面を作成します。

この例では、次に示すように単純なデータ入力画面を作成します

MT.D 属性を使用したクラスの作成

リフレクション API を使用するために最初に必要になるのは、属性で修飾されたクラスです。 これらの属性は、MT.D が Elements API からオブジェクトを作成するために内部的に使用します。 たとえば、次のようなクラス定義について考えます。

public class Expense
{
    [Section("Expense Entry")]

    [Entry("Enter expense name")]
    public string Name;

    [Section("Expense Details")]

    [Caption("Description")]
    [Entry]
    public string Details;

    [Checkbox]
    public bool IsApproved = true;
}

SectionAttribute により UITableView のセクションが作成され、文字列引数を使用してセクションのヘッダーが設定されます。 セクションが宣言されると、それに続くすべてのフィールドは、別のセクションが宣言されるまで、そのセクションに含まれます。 フィールドに対して作成されるユーザー インターフェイス要素の型は、フィールドの型とそれを修飾する MT.D 属性によって異なります。

たとえば、Name フィールドは string で、これは EntryAttribute によって修飾されます。 これにより、テキスト入力フィールドと指定したキャプションを持つ行がテーブルに追加されます。 同様に、IsApproved フィールドは、CheckboxAttribute を持つ bool であり、テーブル セルの右側にチェックボックスを持つテーブル行が追加されます。 MT.D はこのフィールド名を使用し、スペースを自動的に追加して、この場合はキャプションを作成します。これが属性で指定されていないためです。

BindingContext の追加

Expense クラスを使用するには、BindingContext を作成する必要があります。 BindingContext は、属性付きクラスのデータをバインドして要素の階層を作成するクラスです。 これを作成するには、単にそのインスタンスを作成し、属性付きクラスのインスタンスをコンストラクターに渡します。

たとえば、Expense クラスの属性を使用して宣言した UI を追加するには、AppDelegateFinishedLaunching メソッドに次のコードを含めます。

var expense = new Expense ();
var bctx = new BindingContext (null, expense, "Create a task");

これで、UI を作成するために必要なのは、以下に示すように、BindingContextDialogViewController に追加して、それをウィンドウの RootViewController として設定することだけです。

UIWindow window;

public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{   
    window = new UIWindow (UIScreen.MainScreen.Bounds);

    var expense = new Expense ();
    var bctx = new BindingContext (null, expense, "Create a task");
    var dvc = new DialogViewController (bctx.Root);

    window.RootViewController = dvc;
    window.MakeKeyAndVisible ();

    return true;
}

アプリケーションを実行すると、上記の画面が表示されるようになります。

UINavigationController の追加

ただし、BindingContext に渡した “Create a task” というタイトルは表示されないことに注意してください。 これは、DialogViewControllerUINavigatonController の一部ではないためです. 以下に示すように、ウィンドウの RootViewController, として UINavigationController を追加し、UINavigationController のルートとして DialogViewController を追加するようにコードを変更してみましょう。

nav = new UINavigationController(dvc);
window.RootViewController = nav;

アプリケーションを実行すると、次のスクリーンショットに示すように、タイトルが UINavigationController’s ナビゲーション バーに表示されるようになりました。

アプリケーションを実行すると、タイトルが UINavigationControllers ナビゲーション バーに表示されます

UINavigationController を含めることで、ナビゲーションが必要な MT.D の他の機能を利用できるようになりました。 たとえば、Expense クラスに列挙型に追加して、経費のカテゴリを定義できます。そうすると、MT.D によって選択画面が自動的に作成されます。 デモンストレーションを行うために、次のように ExpenseCategory フィールドを組み込むように Expense クラスを変更します。

public enum Category
{
    Travel,
    Lodging,
    Books
}

public class Expense
{
    …

    [Caption("Category")]
    public Category ExpenseCategory;
}

アプリケーションを実行すると、次のように、テーブルにカテゴリの新しい行が表示されるようになりした。

アプリケーションを実行すると、次のように、テーブルにカテゴリの新しい行が表示されるようになりした

次に示すように、行を選択すると、アプリケーションは列挙型に対応する行を含む新しい画面に移動します。

行を選択すると、アプリケーションは列挙型に対応する行を含む新しい画面に移動します

まとめ

この記事では、リフレクション API のチュートリアルを紹介しました。 クラスに属性を追加して、表示される内容を制御する方法について説明しました。 また、あるクラスから、作成される要素階層にデータをバインドするために BindingContext を使用する方法と、UINavigationController で MT.D を使用する方法についても説明しました。