リフレクション 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 の使用は、次のように簡単です。
- MT.D 属性で修飾されたクラスを作成します。
BindingContext
インスタンスを作成し、上記のクラスのインスタンスを渡します。DialogViewController
を作成し、BindingContext’s
RootElement
を渡します。
リフレクション 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 を追加するには、AppDelegate
の FinishedLaunching
メソッドに次のコードを含めます。
var expense = new Expense ();
var bctx = new BindingContext (null, expense, "Create a task");
これで、UI を作成するために必要なのは、以下に示すように、BindingContext
を DialogViewController
に追加して、それをウィンドウの 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” というタイトルは表示されないことに注意してください。 これは、DialogViewController
が UINavigatonController
の一部ではないためです. 以下に示すように、ウィンドウの RootViewController,
として UINavigationController
を追加し、UINavigationController
のルートとして DialogViewController
を追加するようにコードを変更してみましょう。
nav = new UINavigationController(dvc);
window.RootViewController = nav;
アプリケーションを実行すると、次のスクリーンショットに示すように、タイトルが UINavigationController’s
ナビゲーション バーに表示されるようになりました。
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 を使用する方法についても説明しました。