Compartilhar via


Controles de tabela do watchOS no Xamarin

O controle do watchOS WKInterfaceTable é muito mais simples do que seu equivalente do iOS, mas desempenha uma função semelhante. Ele cria uma lista de rolagem de linhas que podem ter layouts personalizados e que respondem a eventos de toque.

Lista de tabelas de observaçãoDetalhe da tabela de observação

Adicionando uma tabela

Arraste o controle Table para uma cena. Por padrão, ele terá a seguinte aparência (mostrando um único layout de linha não especificado):

Como adicionar uma tabela

Dê um nome à tabela na caixa Nome do bloco Propriedades, para que ela possa ser referenciada no código.

Adicionar um controlador de linha

A tabela inclui automaticamente uma única linha, representada por um controlador de linha que contém um controle Group por padrão.

Para definir a classe para o controlador de linha, selecione a linha na estrutura de tópicos do documento e digite um nome de classe no painel Propriedades:

Inserindo um nome de classe no painel Propriedades

Depois que a classe para o controlador da linha estiver definida, o IDE criará um arquivo C# correspondente no projeto. Arraste controles (como rótulos) para a linha e dê nomes a eles para que possam ser referenciados no código.

Criar e preencher linhas

SetNumberOfRows cria as classes de controlador de linha para cada linha, usando o Identifier para selecionar a correta. Se você tiver dado ao controlador de linha um personalizado Identifier, altere o padrão no trecho de código abaixo para o identificador usado. O RowControllerpara cada linha é criado quando SetNumberOfRows é chamado e a tabela exibida.

myTable.SetNumberOfRows ((nint)rows.Count, "default");
    // loads row controller by identifier

Importante

As linhas da tabela não são virtualizadas como no iOS. Tente limitar o número de linhas (a Apple recomenda menos de 20).

Depois que as linhas forem criadas, você precisará preencher cada célula (como GetCell faria no iOS). Este trecho de código atualiza o rótulo em cada linha:

for (var i = 0; i < rows.Count; i++) {
    var elementRow = (RowController)myTable.GetRowController (i);
    elementRow.myRowLabel.SetText (rows [i]);
}

Importante

Usar SetNumberOfRows e, em seguida, fazer um loop usando GetRowController faz com que toda a tabela seja enviada para o relógio. Em exibições subsequentes da tabela, se você precisar adicionar ou remover linhas específicas, use InsertRowsAt e RemoveRowsAt para obter melhor desempenho.

Responder a toques

Você pode responder à seleção de linha de duas maneiras diferentes:

  • implementar o método no controlador de DidSelectRow interface, ou
  • Crie um acompanhamento no storyboard e implemente GetContextForSegue se quiser que a seleção de linha abra outra cena.

DidSelectRow

Para manipular programaticamente a seleção de linha, implemente o DidSelectRow método. Para abrir uma nova cena, use PushController e passe o identificador da cena e o contexto de dados a serem usados:

public override void DidSelectRow (WKInterfaceTable table, nint rowIndex)
{
    var rowData = rows [(int)rowIndex];
    Console.WriteLine ("Row selected:" + rowData);
    // if selection should open a new scene
    PushController ("secondInterface", rows[(int)rowIndex]);
}

GetContextForSegue

Arraste uma sequência no storyboard da linha da tabela para outra cena (mantenha pressionada a tecla Control enquanto arrasta). Certifique-se de selecionar o segue e dar-lhe um identificador no painel Propriedades (como secondLevel no exemplo abaixo).

No controlador de interface, implemente o GetContextForSegue método e retorne o contexto de dados que deve ser fornecido para a cena apresentada pelo segue.

public override NSObject GetContextForSegue (string segueIdentifier, WKInterfaceTable table, nint rowIndex)
{
    if (segueIdentifier == "secondLevel") {
        return new NSString (rows[(int)rowIndex]);
    }
    return null;
}

Esses dados são passados para a cena de storyboard de destino em seu Awake método.

Vários tipos de linha

Por padrão, o controle de tabela tem um único tipo de linha que você pode criar. Para adicionar mais 'modelos' de linha, use a caixa Linhas no painel Propriedades para criar mais controladores de linha:

Definindo o número de linhas do protótipo

Definir a propriedade Rows como 3 criará espaços reservados de linha adicionais para você arrastar controles. Para cada linha, defina o nome da classe no painel Propriedades para garantir que a classe do controlador de linha seja criada.

As linhas do protótipo no designer

Para preencher uma tabela com tipos de linha diferentes, use o SetRowTypes método para especificar o tipo de controlador de linha a ser usado para cada linha na tabela. Use os identificadores da linha para especificar qual controlador de linha deve ser usado para cada linha.

O número de elementos nessa matriz deve corresponder ao número de linhas que você espera que estejam na tabela:

myTable.SetRowTypes (new [] {"type1", "default", "default", "type2", "default"});

Ao preencher uma tabela com vários controladores de linha, você precisará acompanhar o tipo esperado ao preencher a interface do usuário:

for (var i = 0; i < rows.Count; i++) {
    if (i == 0) {
        var elementRow = (Type1RowController)myTable.GetRowController (i);
        // populate UI controls
    } else if (i == 3) {
        var elementRow = (Type2RowController)myTable.GetRowController (i);
        // populate UI controls
    } else {
        var elementRow = (DefaultRowController)myTable.GetRowController (i);
        // populate UI controls
    }
}

Paginação de detalhes verticais

O watchOS 3 introduziu um novo recurso para tabelas: a capacidade de rolar pelas páginas de detalhes relacionadas a cada linha, sem ter que voltar para a tabela e escolher outra linha. As telas de detalhes podem ser roladas deslizando para cima e para baixo, ou usando a Digital Crown.

Exemplo de paginação de detalhes verticaisDetalhes de paginação vertical

Importante

No momento, esse recurso só está disponível editando o storyboard no Xcode Interface Builder.

Para habilitar esse recurso, selecione o na superfície de WKInterfaceTable design e marque a opção Paginação de detalhes vertical:

Selecionando a opção Paginação de detalhes vertical

Conforme explicado pela Apple , a navegação na tabela deve usar o recurso de paginação para funcionar. Reescreva qualquer código existente que use PushController segues.

Apêndice: Exemplo de código do controlador de linha

O IDE criará automaticamente dois arquivos de código quando um controlador de linha for criado no designer. O código nesses arquivos gerados é mostrado abaixo para referência.

O primeiro será nomeado para a classe, por exemplo , RowController.cs, assim:

using System;
using Foundation;

namespace WatchTablesExtension
{
    public partial class RowController : NSObject
    {
        public RowController ()
        {
        }
    }
}

O outro arquivo .designer.cs é uma definição de classe parcial que contém as saídas e ações que são criadas na superfície do designer, como este exemplo com um WKInterfaceLabel controle:

using Foundation;
using System;
using System.CodeDom.Compiler;
using UIKit;

namespace WatchTables.OnWatchExtension
{
    [Register ("RowController")]
    partial class RowController
    {
        [Outlet]
        [GeneratedCode ("iOS Designer", "1.0")]
        public WatchKit.WKInterfaceLabel MyLabel { get; set; }

        void ReleaseDesignerOutlets ()
        {
            if (MyLabel != null) {
                MyLabel.Dispose ();
                MyLabel = null;
            }
        }
    }
}

As saídas e ações declaradas aqui podem então ser referenciadas em código - no entanto, o arquivo .designer.cs NÃO deve ser editado diretamente.