리플렉션 API를 사용 하 여 Xamarin.ios 응용 프로그램 만들기Creating a Xamarin.iOS application using the Reflection API

MT입니다. D 리플렉션 API를 사용 하면 클래스를 MT 인 특성으로 데코레이팅 할 수 있습니다. D는를 사용 하 여 화면을 자동으로 만듭니다.The MT.D Reflection API allows classes to be decorated with attributes that MT.D uses to create screens automatically. 리플렉션 API는 이러한 클래스와 화면에 표시 되는 항목 간의 바인딩을 제공 합니다.The reflection API provides a binding between these classes and what is displayed on screen. 이 API는 요소 API에서 사용 하는 세분화 된 제어를 제공 하지 않지만 클래스 장식을 기반으로 요소 계층 구조를 자동으로 작성 하 여 복잡성을 줄입니다.Although this API doesn’t provide the fine-grained control that the elements API does, it reduces complexity by automatically building out the element hierarchy based on class decoration.

MT를 설정 합니다. 2Setting up MT.D

휴먼. D는 Xamarin.ios를 사용 하 여 배포 됩니다.MT.D is distributed with Xamarin.iOS. 이를 사용 하려면 Visual Studio 2017 또는 Mac용 Visual Studio에서 Xamarin.ios 프로젝트의 참조 노드를 마우스 오른쪽 단추로 클릭 하 고 monotouch.dialog 어셈블리에 대 한 참조를 추가 합니다.To use it, right-click on the References node of a Xamarin.iOS project in Visual Studio 2017 or Visual Studio for Mac and add a reference to the MonoTouch.Dialog-1 assembly. 그런 다음 필요에 따라 소스 코드에 using MonoTouch.Dialog 문을 추가 합니다.Then, add using MonoTouch.Dialog statements in your source code as necessary.

리플렉션 API 시작Getting started with the Reflection API

리플렉션 API를 사용 하는 것은 다음과 같이 간단 합니다.Using the Reflection API is as simple as:

  1. MT로 데코레이팅된 클래스 만들기 D 특성.Creating a class decorated with MT.D attributes.
  2. BindingContext 인스턴스를 만들고 위의 클래스의 인스턴스를 전달 합니다.Creating a BindingContext instance, passing it an instance of the above class.
  3. DialogViewController를 만들고 BindingContext’s RootElement 전달 합니다.Creating a DialogViewController , passing it the BindingContext’s RootElement .

리플렉션 API를 사용 하는 방법을 보여 주는 예를 살펴보겠습니다.Let’s look at an example to illustrate how to use the Reflection API. 이 예에서는 아래와 같이 간단한 데이터 입력 화면을 작성 합니다.In this example, we’ll build a simple data entry screen as shown below:

MT를 사용 하 여 클래스 만들기 D 특성Creating a class with MT.D attributes

리플렉션 API를 사용 해야 하는 첫 번째 작업은 특성을 사용 하 여 데코레이팅된 클래스입니다.The first thing we need to use the Reflection API is a class decorated with attributes. 이러한 특성은 MT에서 사용 됩니다. D는 내부적으로 요소 API에서 개체를 만듭니다.These attributes will be used by MT.D internally to create objects from the Elements API. 예를 들어 다음과 같은 클래스 정의를 살펴보겠습니다.For example, consider the following class definition:

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 섹션이 생성 됩니다.The SectionAttribute will result in sections of the UITableView being created, with the string argument used to populate the section’s header. 섹션이 선언 되 면 다른 섹션이 선언 될 때까지 뒤에 오는 모든 필드가 해당 섹션에 포함 됩니다.Once a section is declared, every field that follows it will be included in that section, until another section is declared. 필드에 대해 생성 되는 사용자 인터페이스 요소의 형식은 필드의 형식과 MT에 따라 달라 집니다. D 특성 데코레이팅The type of user interface element created for the field will depend upon the field’s type and the MT.D attribute decorating it.

예를 들어 Name 필드는 string 이며 EntryAttribute로 데코 레이트 됩니다.For example, the Name field is a string and it is decorated with an EntryAttribute. 그러면 텍스트 입력 필드와 지정 된 캡션이 있는 행이 테이블에 추가 됩니다.This results in a row being added to the table with a text entry field and the specified caption. 마찬가지로 IsApproved 필드는 CheckboxAttribute``bool 이므로 테이블 셀의 오른쪽에 확인란을 포함 하는 테이블 행이 생성 됩니다.Similarly, the IsApproved field is a bool with a CheckboxAttribute, resulting in a table row with a checkbox on the right of the table cell. 휴먼. D는 특성에 지정 되지 않았으므로 필드 이름을 사용 하 여 자동으로 공백을 추가 하 고이 경우에 캡션을 만듭니다.MT.D uses the field name, automatically adding a space, to create the caption in this case, since it is not specified in an attribute.

BindingContext 추가Adding the BindingContext

Expense 클래스를 사용 하려면 BindingContext를 만들어야 합니다.To use the Expense class, we need to create a BindingContext. BindingContext은 특성을 사용 하는 클래스의 데이터를 바인딩하여 요소 계층 구조를 만드는 클래스입니다.A BindingContext is a class that will bind the data from the attributed class to create the hierarchy of elements. 이를 만들려면 단순히 인스턴스화하고 특성 사용 클래스의 인스턴스를 생성자에 전달 합니다.To create one, we simply instantiate it and pass in an instance of the attributed class to the constructor.

예를 들어 Expense 클래스에서 특성을 사용 하 여 선언한 UI를 추가 하려면 AppDelegateFinishedLaunching 메서드에 다음 코드를 포함 합니다.For example, to add UI that we declared using attribute in the Expense class, include the following code in the FinishedLaunching method of the AppDelegate:

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

그런 다음 DialogViewControllerBindingContext를 추가 하 고 아래와 같이 창의 RootViewController으로 설정 하는 것이 UI를 만들어야 합니다.Then all we have to do to create the UI is add the BindingContext to the DialogViewController and set it as the RootViewController of the window, as shown below:

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;
}

이제 응용 프로그램을 실행 하면 위에 표시 된 화면이 표시 됩니다.Running the application now results in the screen shown above being displayed.

UINavigationController 추가Adding a UINavigationController

그러나 BindingContext 전달 된 "작업 만들기" 제목은 표시 되지 않습니다.Notice however that the title “Create a task” that we passed to the BindingContext is not displayed. 이는 DialogViewController UINavigatonController의 일부가 아니기 때문입니다.This is because the DialogViewController is not part of a UINavigatonController. 코드를 변경 하 여 창의 RootViewController,UINavigationController을 추가 하 고 아래와 같이 DialogViewControllerUINavigationController의 루트로 추가 해 보겠습니다.Let’s change the code to add a UINavigationController as the window’s RootViewController, and add the DialogViewController as the root of the UINavigationController as shown below:

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

이제 응용 프로그램을 실행할 때 아래 스크린샷에 표시 된 대로 제목이 UINavigationController’s 탐색 모음에 표시 됩니다.Now when we run the application, the title appears in the UINavigationController’s navigation bar as the screenshot below shows:

이제 UINavigationController를 포함 하 여 MT의 다른 기능을 활용할 수 있습니다. 해당 탐색이 필요한 D입니다.By including a UINavigationController, we can now take advantage of other features of MT.D for which navigation is necessary. 예를 들어, Expense 클래스에 열거형을 추가 하 여 경비 및 MT의 범주를 정의할 수 있습니다. D는 자동으로 선택 화면을 만듭니다.For example, we can add an enumeration to the Expense class to define the category for the expense, and MT.D will create a selection screen automatically. 이를 보여 주기 위해 다음과 같이 ExpenseCategory 필드를 포함 하도록 Expense 클래스를 수정 합니다.To demonstrate, modify the Expense class to include an ExpenseCategory field as follows:

public enum Category
{
    Travel,
    Lodging,
    Books
}
        
public class Expense
{
    …

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

이제 응용 프로그램을 실행 하면 다음과 같이 범주에 대 한 테이블에 새 행이 생성 됩니다.Running the application now results in a new row in the table for the category as shown:

행을 선택 하면 응용 프로그램에서 아래와 같이 열거형에 해당 하는 행이 있는 새 화면으로 이동 합니다.Selecting the row results in the application navigating to a new screen with rows corresponding to the enumeration, as shown below:

요약Summary

이 문서에서는 리플렉션 API에 대 한 연습을 제공 했습니다.This article presented a walkthrough of the Reflection API. 클래스에 특성을 추가 하 여 표시 되는 항목을 제어 하는 방법을 살펴보았습니다.We showed how to add attributes to a class to control what is displayed. 또한 BindingContext를 사용 하 여 클래스의 데이터를 만들어진 요소 계층 구조와 MT를 사용 하는 방법에 바인딩하는 방법에 대해 설명 했습니다. D UINavigationController를 사용 합니다.We also discussed how to use a BindingContext to bind data from a class to the element hierarchy that is created, as well as how to use MT.D with a UINavigationController.