Compartilhar via


Criando um aplicativo Xamarin.iOS usando a API de Reflexão

O MT. D Reflection API permite que as classes sejam decoradas com atributos que MT. D usa para criar telas automaticamente. A API de reflexão fornece uma ligação entre essas classes e o que é exibido na tela. Embora essa API não forneça o controle refinado que a API de elementos fornece, ela reduz a complexidade criando automaticamente a hierarquia de elementos com base na decoração de classe.

Configurando o MT. D

MT. D é distribuído com o Xamarin.iOS. Para usá-lo, clique com o botão direito do mouse no nó Referências de um projeto Xamarin.iOS no Visual Studio 2017 ou Visual Studio para Mac e adicione uma referência ao assembly MonoTouch.Dialog-1 . Em seguida, adicione using MonoTouch.Dialog instruções em seu código-fonte conforme necessário.

Introdução à API de reflexão

Usar a API de reflexão é tão simples quanto:

  1. Criando uma classe decorada com MT. D atributos.
  2. Criando uma BindingContext instância, passando a ela uma instância da classe acima.
  3. Criando um DialogViewController , passando o BindingContext’s RootElement .

Vejamos um exemplo para ilustrar como usar a API de reflexão. Neste exemplo, criaremos uma tela de entrada de dados simples, conforme mostrado abaixo:

Neste exemplo, criaremos uma tela de entrada de dados simples, conforme mostrado aqui

Criando uma classe com MT. Atributos D

A primeira coisa que precisamos para usar a API de Reflexão é uma classe decorada com atributos. Esses atributos serão usados pela MT. D internamente para criar objetos a partir da API Elements. Por exemplo, considere a seguinte definição de classe:

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

Isso SectionAttribute resultará na criação de seções do UITableView , com o argumento string usado para preencher o cabeçalho da seção. Depois que uma seção for declarada, todos os campos que a seguirem serão incluídos nessa seção, até que outra seção seja declarada. O tipo de elemento de interface do usuário criado para o campo dependerá do tipo do campo e do MT. D decorando-o.

Por exemplo, o campo é um string e é decorado Name com um EntryAttribute. Isso resulta na adição de uma linha à tabela com um campo de entrada de texto e a legenda especificada. Da mesma forma, o IsApproved campo é um bool com um CheckboxAttribute, resultando em uma linha da tabela com uma caixa de seleção à direita da célula da tabela. MT. D usa o nome do campo, adicionando automaticamente um espaço, para criar a legenda neste caso, uma vez que ela não é especificada em um atributo.

Adicionando o BindingContext

Para usar a Expense classe, precisamos criar um BindingContextarquivo . A BindingContext é uma classe que vinculará os dados da classe atribuída para criar a hierarquia de elementos. Para criar um, simplesmente instanciamos e passamos uma instância da classe atribuída ao construtor.

Por exemplo, para adicionar a interface do usuário que declaramos usando o Expense atributo na classe, inclua o seguinte código no FinishedLaunching método do AppDelegate:

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

Então, tudo o que precisamos fazer para criar a interface do usuário é adicionar o BindingContext DialogViewController ao e defini-lo como o RootViewController da janela, conforme mostrado abaixo:

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

A execução do aplicativo agora resulta na exibição da tela mostrada acima.

Adicionando um UINavigationController

Observe, no entanto, que o título "Criar uma tarefa" que passamos para o BindingContext não é exibido. Isso ocorre porque o DialogViewController não faz parte de um UINavigatonController. Vamos alterar o código para adicionar a UINavigationController como a janela RootViewController, e adicionar o DialogViewController como a raiz do UINavigationController como mostrado abaixo:

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

Agora, quando executamos o aplicativo, o título aparece na UINavigationController’s barra de navegação, como mostra a captura de tela abaixo:

Agora, quando executamos o aplicativo, o título aparece na barra de navegação UINavigationControllers

Ao incluir um UINavigationController, agora podemos tirar proveito de outros recursos do MT. D para o qual a navegação é necessária. Por exemplo, podemos adicionar uma enumeração à Expense classe para definir a categoria da despesa e MT. D criará uma tela de seleção automaticamente. Para demonstrar, modifique a Expense classe para incluir um ExpenseCategory campo da seguinte maneira:

public enum Category
{
    Travel,
    Lodging,
    Books
}

public class Expense
{
    …

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

A execução do aplicativo agora resulta em uma nova linha na tabela para a categoria, conforme mostrado:

A execução do aplicativo agora resulta em uma nova linha na tabela para a categoria, conforme mostrado

A seleção da linha faz com que a aplicação navegue para uma nova tela com linhas correspondentes à enumeração, conforme mostrado abaixo:

A seleção da linha faz com que o aplicativo navegue para uma nova tela com linhas correspondentes à enumeração

Resumo

Este artigo apresentou um passo a passo da API de reflexão. Mostramos como adicionar atributos a uma classe para controlar o que é exibido. Também discutimos como usar um para vincular dados de uma classe à hierarquia de elementos que é criada, bem como como usar MT BindingContext . D com um UINavigationController.