다음을 통해 공유


Xamarin.iOS용 MonoTouch.Dialog 소개

MT라고 하는 MonoTouch.Dialog 간단히 말해서 D는 개발자가 보기 컨트롤러, 테이블 등을 만드는 지루함 대신 정보를 사용하여 애플리케이션 화면 및 탐색을 빌드할 수 있는 빠른 UI 개발 도구 키트입니다. 따라서 UI 개발 및 코드 감소를 크게 간소화할 수 있습니다. 예를 들어 다음 스크린샷을 고려합니다.

예를 들어 이 스크린샷을 고려해 보세요.

다음 코드는 이 전체 화면을 정의하는 데 사용되었습니다.

public enum Category
{
    Travel,
    Lodging,
    Books
}
        
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;
    [Caption("Category")]
    public Category ExpenseCategory;
}

iOS에서 테이블을 사용할 때 반복 코드가 많은 경우가 많습니다. 예를 들어 테이블이 필요할 때마다 해당 테이블을 채우기 위해 데이터 원본이 필요합니다. 탐색 컨트롤러를 통해 연결된 두 개의 테이블 기반 화면이 있는 애플리케이션에서 각 화면은 동일한 코드를 많이 공유합니다.

마운트. D는 테이블 만들기를 위해 모든 코드를 제네릭 API로 캡슐화하여 이를 간소화합니다. 그런 다음 보다 쉽게 선언적 개체 바인딩 구문을 허용하는 해당 API 위에 추상화 기능을 제공합니다. 따라서 MT에서 사용할 수 있는 두 가지 API가 있습니다. D:

  • 하위 수준 요소 APIElements API 는 화면 및 해당 구성 요소를 나타내는 요소의 계층 트리를 만드는 데 기반합니다. Elements API는 개발자에게 UI를 만들 때 가장 유연하고 제어할 수 있는 기능을 제공합니다. 또한 Elements API는 JSON을 통한 선언적 정의에 대한 고급 지원을 제공합니다. 이를 통해 매우 빠른 선언과 서버의 동적 UI 생성을 모두 사용할 수 있습니다.
  • 상위 수준 리플렉션 API – 바인딩API라고도 하며, 클래스는 UI 힌트로 주석을 추가한 다음 MT로 주석을 추가합니다. D는 자동으로 개체를 기반으로 화면을 만들고 화면에 표시되는 항목과 선택적으로 편집된 항목과 기본 개체 백업 간에 바인딩을 제공합니다. 위의 예제에서는 리플렉션 API의 사용을 설명했습니다. 이 API는 요소 API가 수행하는 세분화된 컨트롤을 제공하지 않지만 클래스 특성에 따라 요소 계층 구조를 자동으로 구축하여 복잡성을 더욱 줄입니다.

마운트. D는 화면 만들기를 위한 기본 제공 UI 요소의 큰 집합으로 가득 차 있지만 사용자 지정된 요소 및 고급 화면 레이아웃의 필요성도 인식합니다. 따라서 확장성은 API에 구운 일류 기능입니다. 개발자는 기존 요소를 확장하거나 새 요소를 만든 다음 원활하게 통합할 수 있습니다.

또한 MT. D에는 "풀 투 새로 고침" 지원, 비동기 이미지 로드 및 검색 지원과 같은 여러 가지 일반적인 iOS UX 기능이 기본 제공됩니다.

이 문서에서는 MT 작업을 포괄적으로 살펴보겠습니다. D는 다음을 포함합니다.

  • 마운트. D 구성 요소 – MT를 구성하는 클래스를 이해하는 데 중점을 줍니다. D를 사용하면 속도를 빠르게 높일 수 있습니다.
  • 요소 참조 – MT.D의 기본 제공 요소에 대한 포괄적인 목록입니다.
  • 고급 사용 – 여기에는 풀 투 새로 고침, 검색, 배경 이미지 로드, LINQ를 사용하여 요소 계층 구조 빌드, MT.D와 함께 사용할 사용자 지정 요소, 셀 및 컨트롤러 만들기와 같은 고급 기능이 포함되어 있습니다.

MT 설정 D

마운트. D는 Xamarin.iOS와 함께 배포됩니다. 이를 사용하려면 Visual Studio 2017에서 Xamarin.iOS 프로젝트의 참조 노드를 마우스 오른쪽 단추로 클릭하거나 Mac용 Visual Studio MonoTouch.Dialog-1 어셈블리에 대한 참조를 추가합니다. 그런 다음 필요에 따라 소스 코드에 문을 추가 using MonoTouch.Dialog 합니다.

MT의 조각 이해 D

리플렉션 API를 사용하는 경우에도 MT입니다. D는 Elements API를 통해 직접 생성된 것처럼 내부 아래에 요소 계층 구조를 만듭니다. 또한 이전 섹션에서 언급한 JSON 지원도 요소를 만듭니다. 이러한 이유로 MT.D의 구성 요소를 기본적으로 이해하는 것이 중요합니다.

마운트. D는 다음 네 부분으로 화면을 빌드합니다.

  • DialogViewController
  • RootElement
  • 섹션
  • 요소

DialogViewController

DialogViewController 또는 짧은 DVC는 상속되므로 UITableViewController 테이블이 있는 화면을 나타냅니다. 일반 UITableViewController와 마찬가지로 DVC를 탐색 컨트롤러에 푸시할 수 있습니다.

RootElement

RootElement는 DVC로 이동하는 항목에 대한 최상위 컨테이너입니다. 섹션이 포함되어 있으므로 요소를 포함할 수 있습니다. RootElements는 렌더링되지 않습니다. 대신 실제로 렌더링되는 항목에 대한 컨테이너일 뿐입니다. RootElement는 DVC에 할당된 다음 DVC가 자식을 렌더링합니다.

섹션

섹션은 표에 있는 셀 그룹입니다. 일반 테이블 섹션과 마찬가지로 다음 스크린샷과 같이 텍스트 또는 사용자 지정 보기일 수 있는 머리글과 바닥글을 선택적으로 사용할 수 있습니다.

일반 테이블 섹션과 마찬가지로 필요에 따라 이 스크린샷과 같이 텍스트 또는 사용자 지정 보기일 수 있는 머리글과 바닥글을 가질 수 있습니다.

요소

요소는 표의 실제 셀을 나타냅니다. 마운트. D는 다양한 데이터 형식 또는 다른 입력을 나타내는 다양한 요소로 가득 차 있습니다. 예를 들어 다음 스크린샷은 사용 가능한 몇 가지 요소를 보여 줍니다.

예를 들어 이 스크린샷은 사용 가능한 몇 가지 요소를 보여 줍니다.

섹션 및 RootElements에 대한 자세한 정보

이제 RootElements 및 섹션에 대해 자세히 살펴보겠습니다.

RootElements

MonoTouch.Dialog 프로세스를 시작하려면 하나 이상의 RootElement가 필요합니다.

RootElement가 섹션/요소 값으로 초기화된 경우 이 값은 디스플레이의 오른쪽에 렌더링되는 구성의 요약을 제공하는 자식 요소를 찾는 데 사용됩니다. 예를 들어 아래 스크린샷은 왼쪽에 있는 표와 오른쪽의 세부 정보 화면 제목이 포함된 셀", 선택한 사막의 값과 함께 표시됩니다.

이 스크린샷은 왼쪽에 있는 표와 오른쪽의 세부 정보 화면 제목이 포함된 셀, 선택한 사막의 값과 함께 디저트를 보여줍니다.아래 스크린샷은 왼쪽에 있는 표와 오른쪽의 세부 정보 화면 제목이 포함된 셀, 선택한 사막의 값과 함께 디저트를 보여줍니다.

위와 같이 섹션 내에서 루트 요소를 사용하여 새 중첩된 구성 페이지 로드를 트리거할 수도 있습니다. 이 모드에서 사용되는 경우 제공된 캡션은 섹션 내에서 렌더링되는 동안 사용되며 하위 페이지의 제목으로도 사용됩니다. 예시:

var root = new RootElement ("Meals") {
    new Section ("Dinner") {
        new RootElement ("Dessert", new RadioGroup ("dessert", 2)) {
            new Section () {
                new RadioElement ("Ice Cream", "dessert"),
                new RadioElement ("Milkshake", "dessert"),
                new RadioElement ("Chocolate Cake", "dessert")
            }
        }
    }
};

위의 예제에서 사용자가 "디저트"를 탭하면 MonoTouch.Dialog에서 새 페이지를 만들고 루트가 "디저트"이고 세 개의 값이 있는 라디오 그룹이 있는 페이지로 이동합니다.

이 특정 샘플에서는 라디오 그룹에 값 "2"를 전달했기 때문에 라디오 그룹은 "디저트" 섹션에서 "초콜릿 케이크"를 선택합니다. 즉, 목록에서 세 번째 항목(인덱스 0)을 선택합니다.

Add 메서드를 호출하거나 C# 4 이니셜라이저 구문을 사용하면 섹션이 추가됩니다. 삽입 메서드는 애니메이션이 있는 섹션을 삽입하기 위해 제공됩니다.

그룹 인스턴스(RadioGroup 대신)를 사용하여 RootElement를 만드는 경우 섹션에 표시될 때 RootElement의 요약 값은 Group.Key 값과 동일한 키를 가진 모든 BooleanElements 및 CheckboxElements의 누적 개수가 됩니다.

섹션

섹션은 화면에서 요소를 그룹화하는 데 사용되며 RootElement의 유일한 유효한 직접 자식입니다. 섹션에는 새 RootElements를 비롯한 모든 표준 요소가 포함될 수 있습니다.

섹션에 포함된 RootElements는 새로운 심층 수준으로 이동하는 데 사용됩니다.

섹션에는 문자열 또는 UIView로 머리글과 바닥글을 사용할 수 있습니다. 일반적으로 문자열만 사용하지만 사용자 지정 UI를 만들려면 모든 UIView를 머리글 또는 바닥글로 사용할 수 있습니다. 문자열을 사용하여 다음과 같이 만들 수 있습니다.

var section = new Section ("Header", "Footer");

뷰를 사용하려면 생성자에 뷰를 전달하기만 하면됩니다.

var header = new UIImageView (Image.FromFile ("sample.png"));
var section = new Section (header);

알림 받기

NSAction 처리

마운트. D는 NSAction 콜백을 처리하기 위한 대리자로 표시됩니다. 예를 들어 MT.D에서 만든 테이블 셀에 대한 터치 이벤트를 처리하려는 경우를 예로 들어 보겠습니다. MT를 사용하여 요소를 만들 때 D는 아래와 같이 콜백 함수를 제공합니다.

new Section () {
    new StringElement ("Demo Callback", delegate { Console.WriteLine ("Handled"); })
}

요소 값 검색

이 속성과 Element.Value 결합된 콜백은 다른 요소에서 설정된 값을 검색할 수 있습니다. 예를 들어, 다음 코드를 고려하세요.

var element = new EntryElement (task.Name, "Enter task description", task.Description);
                
var taskElement = new RootElement (task.Name) {
    new Section () { element },
    new Section () { new DateElement ("Due Date", task.DueDate) },
    new Section ("Demo Retrieving Element Value") {
        new StringElement ("Output Task Description", delegate { Console.WriteLine (element.Value); })
    }
};

이 코드는 아래와 같이 UI를 만듭니다. 이 예제의 전체 연습은 Elements API 연습 자습서를 참조하세요.

Element.Value 속성과 결합된 콜백은 다른 요소에서 설정된 값을 검색할 수 있습니다.

사용자가 아래쪽 테이블 셀을 누르면 익명 함수의 코드가 실행되어 인스턴스element 값을 Mac용 Visual Studio 애플리케이션 출력 패드에 기록합니다.

기본 제공 요소

마운트. D에는 Elements라고 하는 여러 기본 제공 테이블 셀 항목이 함께 제공됩니다. 이러한 요소는 문자열, 부동 소수 자릿수, 날짜 및 이미지와 같은 표 셀에 다양한 형식을 표시하는 데 사용됩니다. 각 요소는 데이터 형식을 적절하게 표시합니다. 예를 들어 부울 요소는 해당 값을 토글하는 스위치를 표시합니다. 마찬가지로 float 요소에는 float 값을 변경하는 슬라이더가 표시됩니다.

이미지 및 html과 같은 더 풍부한 데이터 형식을 지원하는 더 복잡한 요소가 있습니다. 예를 들어 선택 시 웹 페이지를 로드하는 UIWebView를 여는 html 요소는 표 셀에 캡션을 표시합니다.

요소 값 작업

사용자 입력을 캡처하는 데 사용되는 요소는 언제든지 요소의 현재 값을 보유하는 public Value 속성을 노출합니다. 사용자가 애플리케이션을 사용할 때 자동으로 업데이트됩니다.

MonoTouch.Dialog의 일부인 모든 요소에 대한 동작이지만 사용자가 만든 요소에는 필요하지 않습니다.

String 요소

StringElement 셀의 왼쪽에 캡션이 표시되고 셀 오른쪽에 문자열 값이 표시됩니다.

StringElement는 표 셀의 왼쪽에 캡션을 표시하고 셀의 오른쪽에 문자열 값을 표시합니다.

단추로 StringElement 사용하려면 대리자를 제공합니다.

new StringElement ("Click me", () => { 
    new UIAlertView("Tapped", "String Element Tapped", null, "ok", null).Show();
});

StringElement를 단추로 사용하려면 대리자를 제공합니다.

스타일이 지정된 String 요소

A StyledStringElement 를 사용하면 기본 제공 표 셀 스타일 또는 사용자 지정 서식을 사용하여 문자열을 표시할 수 있습니다.

StyledStringElement를 사용하면 기본 제공 표 셀 스타일 또는 사용자 지정 서식을 사용하여 문자열을 표시할 수 있습니다.

클래스는 파생StringElement되지만 개발자는 StyledStringElement 글꼴, 텍스트 색, 배경 셀 색, 줄 바꿈 모드, 표시할 줄 수 및 액세서리 표시 여부와 같은 몇 가지 속성을 사용자 지정할 수 있습니다.

여러 줄 요소

여러 줄 요소

Entry 요소

EntryElement이름에서 알 수 있듯이 사용자 입력을 가져오는 데 사용됩니다. 문자가 숨겨진 일반 문자열 또는 암호를 지원합니다.

EntryElement는 사용자 입력을 가져오는 데 사용됩니다.

다음 세 가지 값으로 초기화됩니다.

  • 사용자에게 표시될 항목의 캡션입니다.
  • 자리 표시자 텍스트(사용자에게 힌트를 제공하는 회색으로 표시된 텍스트)입니다.
  • 텍스트의 값입니다.

자리 표시자와 값은 null일 수 있습니다. 그러나 캡션이 필요합니다.

언제든지 Value 속성에 액세스하면 값을 검색할 EntryElement수 있습니다.

또한 이 속성은 KeyboardType 생성 시 데이터 입력에 필요한 키보드 유형 스타일로 설정할 수 있습니다. 아래 나열된 값을 UIKeyboardType 사용하여 키보드를 구성하는 데 사용할 수 있습니다.

  • 숫자
  • 휴대폰
  • Url
  • 전자 메일

Boolean 요소

Boolean 요소

Checkbox 요소

Checkbox 요소

Radio 요소

A RadioElement 를 사용하려면 . RadioGroupRootElement지정해야 합니다.

mtRoot = new RootElement ("Demos", new RadioGroup("MyGroup", 0));

RadioElement를 사용하려면 RootElement에 RadioGroup을 지정해야 합니다.

RootElements 는 라디오 요소를 조정하는 데도 사용됩니다. 멤버는 RadioElement 여러 섹션에 걸쳐 있습니다(예: 링 톤 선택기와 유사한 것을 구현하고 사용자 지정 링 톤을 시스템 벨소리와 분리). 요약 보기에는 현재 선택된 라디오 요소가 표시됩니다. 이를 사용하려면 다음과 같이 그룹 생성자를 사용하여 만듭니 RootElement 다.

var root = new RootElement ("Meals", new RadioGroup ("myGroup", 0));

그룹 이름은 포함된 페이지(있는 경우)에서 RadioGroup 선택한 값을 표시하는 데 사용되며 이 경우 0인 값은 첫 번째 선택한 항목의 인덱스입니다.

Badge 요소

Badge 요소

Float 요소

Float 요소

Activity 요소

Activity 요소

Date 요소

Date 요소

DateElement에 해당하는 셀을 선택하면 아래와 같이 날짜 선택기가 표시됩니다.

DateElement에 해당하는 셀을 선택하면 표시된 대로 날짜 선택기가 표시됩니다.

Time 요소

Time 요소

TimeElement에 해당하는 셀을 선택하면 아래와 같이 시간 선택기가 표시됩니다.

TimeElement에 해당하는 셀을 선택하면 표시된 대로 시간 선택기가 표시됩니다.

DateTime 요소

DateTime 요소

DateTimeElement에 해당하는 셀을 선택하면 아래와 같이 datetime 선택기가 표시됩니다.

DateTimeElement에 해당하는 셀을 선택하면 표시된 대로 datetime 선택기가 표시됩니다.

HTML 요소

HTML 요소

테이블 HTMLElement 셀에 해당 Caption 속성의 값이 표시됩니다. 선택했습니다. 요소에 Url 할당된 값은 아래와 같이 컨트롤에 UIWebView 로드됩니다.

선택했습니다. 요소에 할당된 URL은 아래와 같이 UIWebView 컨트롤에 로드됩니다.

Message 요소

Message 요소

추가 요소 로드

이 요소를 사용하여 사용자가 목록에 더 많은 항목을 로드할 수 있습니다. 일반 및 로드 캡션과 글꼴 및 텍스트 색을 사용자 지정할 수 있습니다. UIActivity 표시기가 애니메이션 효과를 시작하며 사용자가 셀을 탭한 다음 NSAction 생성자에 전달된 캡션이 실행될 때 로드 캡션이 표시됩니다. 코드가 NSAction 완료되면 표시기가 UIActivity 애니메이션 효과를 중지하고 기본 캡션이 다시 표시됩니다.

UIView 요소

또한 모든 사용자 지정 UIView 은 .를 UIViewElement사용하여 표시할 수 있습니다.

소유자가 그린 요소

이 요소는 추상 클래스이므로 서브클래스되어야 합니다. 컨텍스트 및 뷰 매개 변수를 사용하여 지정된 Draw(RectangleF bounds, CGContext context, UIView view) 범위 내에서 사용자 지정된 모든 그리기를 수행해야 하는 요소의 높이를 반환해야 하는 메서드를 재정 Height(RectangleF bounds) 의해야 합니다. 이 요소는 서브클래싱 UIView을 많이 수행하고 반환할 셀에 배치하므로 두 개의 간단한 재정의만 구현하면 됩니다. 파일의 샘플 앱에서 더 나은 샘플 구현을 DemoOwnerDrawnElement.cs 볼 수 있습니다.

클래스를 구현하는 매우 간단한 예제는 다음과 같습니다.

public class SampleOwnerDrawnElement : OwnerDrawnElement
{
    public SampleOwnerDrawnElement (string text) : base(UITableViewCellStyle.Default, "sampleOwnerDrawnElement")
    {
        this.Text = text;
    }

    public string Text { get; set; }

    public override void Draw (RectangleF bounds, CGContext context, UIView view)
    {
        UIColor.White.SetFill();
        context.FillRect(bounds);

        UIColor.Black.SetColor();   
        view.DrawString(this.Text, new RectangleF(10, 15, bounds.Width - 20, bounds.Height - 30), UIFont.BoldSystemFontOfSize(14.0f), UILineBreakMode.TailTruncation);
    }

    public override float Height (RectangleF bounds)
    {
        return 44.0f;
    }
}

JSON 요소

로컬 JsonElement 또는 원격 URL에서 중첩된 자식의 콘텐츠를 로드할 수 있도록 확장 RootElement 되는 하위 클래스 RootElement 입니다.

JsonElement 가지 형식으로 RootElement 인스턴스화할 수 있는 형식입니다. 한 버전은 요청 시 콘텐츠를 로드하는 버전을 만듭니다 RootElement . 이러한 항목은 마지막에 JsonElement 추가 인수를 사용하는 생성자, 콘텐츠를 로드할 URL을 사용하여 생성됩니다.

var je = new JsonElement ("Dynamic Data", "https://tirania.org/tmp/demo.json");

다른 양식은 로컬 파일 또는 이미 구문 분석한 기존 System.Json.JsonObject 파일에서 데이터를 만듭니다.

var je = JsonElement.FromFile ("json.sample");
using (var reader = File.OpenRead ("json.sample"))
    return JsonElement.FromJson (JsonObject.Load (reader) as JsonObject, arg);

MT에서 JSON을 사용하는 방법에 대한 자세한 내용을 보려면 D, JSON 요소 연습 자습서를 참조하세요.

기타 기능

풀 투 새로 고침 지원

끌어오기- 새로 고침은 원래 Tweetie2 앱에서 발견된 시각적 효과로, 많은 애플리케이션에서 인기 있는 효과가 되었습니다.

대화 상자에 자동 끌어오기-새로 고침 지원을 추가하려면 두 가지 작업만 하면 됩니다. 즉, 사용자가 데이터를 끌어올 때 알림을 받도록 이벤트 처리기를 연결하고 데이터가 로드된 시점을 알리 DialogViewController 고 기본 상태로 돌아갑니다.

알림 연결은 간단합니다. 다음과 같이 이벤트의 이벤트에 DialogViewController연결 RefreshRequested 하기만 하면됩니다.

dvc.RefreshRequested += OnUserRequestedRefresh;

그런 다음 메서드 OnUserRequestedRefresh에서 일부 데이터 로드를 큐에 대기하거나, 그물에서 일부 데이터를 요청하거나, 스레드를 회전하여 데이터를 계산합니다. 데이터가 로드되면 새 데이터가 있는 것을 알리 DialogViewController 고 뷰를 기본 상태로 복원하려면 다음을 호출 ReloadComplete하여 이 작업을 수행해야 합니다.

dvc.ReloadComplete ();

검색 지원

검색을 지원하려면 .EnableSearch DialogViewController 검색 창에서 SearchPlaceholder 워터마크 텍스트로 사용할 속성을 설정할 수도 있습니다.

검색하면 보기의 내용이 사용자 유형으로 변경됩니다. 표시되는 필드를 검색하여 사용자에게 표시합니다. 세 DialogViewController 가지 메서드를 노출하여 결과에 대한 새 필터 작업을 프로그래밍 방식으로 시작, 종료 또는 트리거합니다. 이러한 메서드는 다음과 같습니다.

  • StartSearch
  • FinishSearch
  • PerformFilter

시스템이 확장 가능하므로 원하는 경우 이 동작을 변경할 수 있습니다.

배경 이미지 로드

MonoTouch.Dialog는 TweetStation 애플리케이션의 이미지 로더를 통합합니다. 이 이미지 로더는 백그라운드에서 이미지를 로드하는 데 사용할 수 있으며, 캐싱을 지원하며, 이미지가 로드되었을 때 코드에 알릴 수 있습니다.

또한 나가는 네트워크 연결의 수를 제한합니다.

이미지 로더는 클래스에서 ImageLoader 구현되며, 메서드를 호출 DefaultRequestImage 하기만 하면 됩니다. 로드하려는 이미지의 URI와 이미지가 로드될 때 호출될 인터페이스의 IImageUpdated 인스턴스를 제공해야 합니다.

예를 들어 다음 코드는 URL의 이미지를 다음으로 BadgeElement로드합니다.

string uriString = "http://some-server.com/some image url";

var rootElement = new RootElement("Image Loader") {
    new Section() {
        new BadgeElement( ImageLoader.DefaultRequestImage( new Uri(uriString), this), "Xamarin")
    }
};

ImageLoader 클래스는 현재 메모리에 캐시된 모든 이미지를 해제하려는 경우 호출할 수 있는 Purge 메서드를 노출합니다. 현재 코드에는 50개 이미지에 대한 캐시가 있습니다. 다른 캐시 크기를 사용하려는 경우(예를 들어 이미지가 너무 커서 50개의 이미지가 너무 클 것으로 예상되는 경우) ImageLoader 인스턴스를 만들고 캐시에 유지할 이미지 수를 전달할 수 있습니다.

LINQ를 사용하여 요소 계층 구조 만들기

LINQ 및 C#의 초기화 구문을 영리하게 사용하면 LINQ를 사용하여 요소 계층 구조를 만들 수 있습니다. 예를 들어 다음 코드는 일부 문자열 배열에서 화면을 만들고 각각 StringElement에 전달되는 익명 함수를 통해 셀 선택을 처리합니다.

var rootElement = new RootElement ("LINQ root element") {
    from x in new string [] { "one", "two", "three" }
    select new Section (x) {
        from y in "Hello:World".Split (':')
        select (Element) new StringElement (y, delegate { Debug.WriteLine("cell tapped"); })
    }
};

이렇게 하면 XML 데이터 저장소 또는 데이터베이스의 데이터와 쉽게 결합하여 거의 전적으로 데이터에서 복잡한 애플리케이션을 만들 수 있습니다.

MT 확장. D

사용자 지정 요소 만들기

기존 요소에서 상속하거나 루트 클래스 요소에서 파생하여 고유한 요소를 만들 수 있습니다.

사용자 고유의 요소를 만들려면 다음 메서드를 재정의해야 합니다.

// To release any heavy resources that you might have
void Dispose (bool disposing);

// To retrieve the UITableViewCell for your element
// you would need to prepare the cell to be reused, in the
// same way that UITableView expects reusable cells to work
UITableViewCell GetCell (UITableView tv);

// To retrieve a "summary" that can be used with
// a root element to render a summary one level up.  
string Summary ();

// To detect when the user has tapped on the cell
void Selected (DialogViewController dvc, UITableView tableView, NSIndexPath path);

// If you support search, to probe if the cell matches the user input
bool Matches (string text);

요소에 변수 크기가 있을 수 있는 경우 다음 한 가지 메서드를 IElementSizing 포함하는 인터페이스를 구현해야 합니다.

// Returns the height for the cell at indexPath.Section, indexPath.Row
float GetHeight (UITableView tableView, NSIndexPath indexPath);

반환된 셀을 호출 base.GetCell(tv) 하고 사용자 지정하여 메서드를 GetCell 구현하려는 경우 다음과 같이 요소에 고유한 키를 반환하도록 속성을 재정 CellKey 의해야 합니다.

static NSString MyKey = new NSString ("MyKey");
protected override NSString CellKey {
    get {
        return MyKey;
    }
}

이는 대부분의 요소에서 작동하지만 다양한 렌더링 시나리오에 StringElement StyledStringElement 대해 자체 키 집합을 사용하기 때문에 작동하지 않습니다. 이러한 클래스에서 코드를 복제해야 합니다.

DialogViewControllers(DVC)

리플렉션과 Elements API는 모두 동일하게 DialogViewController사용합니다. 보기의 모양을 사용자 지정하거나 UI의 기본 생성을 넘어서는 일부 기능을 UITableViewController 사용하려는 경우가 있습니다.

DialogViewController 클래스는 단지 하위 UITableViewController 클래스일 뿐이며 사용자 지정하는 것과 동일한 방식으로 사용자 지정할 UITableViewController수 있습니다.

예를 들어 목록 스타일을 Grouped Plain원하는 경우 다음과 같이 컨트롤러를 만들 때 속성을 변경하여 이 값을 설정할 수 있습니다.

var myController = new DialogViewController (root, true) {
    Style = UITableViewStyle.Grouped;
}

배경 설정과 같은 고급 사용자 지정의 DialogViewController경우 아래 예제와 같이 서브클래스하고 적절한 메서드를 재정의합니다.

class SpiffyDialogViewController : DialogViewController {
    UIImage image;

    public SpiffyDialogViewController (RootElement root, bool pushing, UIImage image) 
        : base (root, pushing) 
    {
        this.image = image;
    }

    public override LoadView ()
    {
        base.LoadView ();
        var color = UIColor.FromPatternImage(image);
        TableView.BackgroundColor = UIColor.Clear;
        ParentViewController.View.BackgroundColor = color;
    }
}

또 다른 사용자 지정 지점은 다음의 가상 메서드입니다 DialogViewController.

public override Source CreateSizingSource (bool unevenRows)

이 메서드는 셀 크기가 균등하게 조정된 경우의 DialogViewController.Source 하위 클래스 또는 셀이 고르지 않은 경우의 DialogViewController.SizingSource 하위 클래스를 반환해야 합니다.

이 재정의를 사용하여 메서드를 UITableViewSource 캡처할 수 있습니다. 예를 들어 TweetStation 은 이를 사용하여 사용자가 맨 위로 스크롤한 시기를 추적하고 그에 따라 읽지 않은 트윗 수를 업데이트합니다.

유효성 검사

요소는 웹 페이지에 적합한 모델과 데스크톱 애플리케이션이 iPhone 상호 작용 모델에 직접 매핑되지 않으므로 유효성 검사 자체를 제공하지 않습니다.

데이터 유효성 검사를 수행하려면 사용자가 입력한 데이터로 작업을 트리거할 때 이 작업을 수행해야 합니다. 예를 들어 위쪽 도구 모음의 완료 또는 다음 단추 또는 다음 단계로 이동하는 단추로 사용되는 단추 StringElement 가 있습니다.

여기서는 기본 입력 유효성 검사를 수행하고 서버와의 사용자/암호 조합의 유효성 검사와 같이 더 복잡한 유효성 검사를 수행할 수 있습니다.

사용자에게 오류를 알리는 방법은 애플리케이션별로 다릅니다. 팝업하거나 힌트를 UIAlertView 표시할 수 있습니다.

요약

이 문서에서는 MonoTouch.Dialog에 대한 많은 정보를 설명했습니다. MT 방법의 기본 사항을 논의했습니다. D는 작동하며 MT.D를 구성하는 다양한 구성 요소를 다루었습니다. 또한 MT에서 지원하는 다양한 요소 및 테이블 사용자 지정을 보여 줍니다. D 및 MT 방법에 대해 설명했습니다. D는 사용자 지정 요소로 확장할 수 있습니다. 또한 MT의 JSON 지원을 설명했습니다. JSON에서 동적으로 요소를 만들 수 있는 D입니다.