Sunday 16 July 2017

Edgesforextendedlayout Uitableviewcellstyle


Chega até MvvmCross Neste artigo, por Mark Reynolds. Autor do livro Xamarin Essentials. Daremos o próximo passo e veremos como o uso de padrões de design e estruturas pode aumentar a quantidade de código que pode ser reutilizado. Vamos abordar os seguintes tópicos: Uma introdução ao MvvmCross O padrão de design MVVM Conceitos básicos Vistas, ViewModels e comandos Ligação de dados Navegação (ViewModel to ViewModel) A organização do projeto O processo de inicialização Creating NationalParks. MvvmCross Nossa abordagem será a introdução dos conceitos fundamentais Em um nível alto e depois mergulhe e crie o aplicativo de amostra de parques nacionais usando MvvmCross. Isso lhe dará uma compreensão básica de como usar a estrutura e o valor associado à sua utilização. Com isso em mente, vamos começar. (Para obter mais recursos relacionados a este tópico, veja aqui.) Apresentando o MvvmCross O MvvmCross é uma estrutura de código aberto criada por Stuart Lodge. Baseia-se no modelo de design Model-View-ViewModel (MVVM) e é projetado para melhorar a reutilização de código em várias plataformas, incluindo Xamarin. Android, Xamarin. iOS, Windows Phone, Windows Store, WPF e Mac OS X. O MvvmCross O projeto está hospedado no GitHub e pode ser acessado no githubMvvmCrossMvvmCross. O padrão MVVM MVVM é uma variação do padrão Model-View-Controller. Ele separa a lógica tradicionalmente colocada em um objeto View em dois objetos distintos, um chamado View e o outro chamado ViewModel. A View é responsável por fornecer a interface do usuário eo ViewModel é responsável pela lógica de apresentação. A lógica de apresentação inclui a transformação de dados do Modelo em um formulário que é adequado para a interface do usuário para trabalhar e mapear a interação do usuário com a Vista em solicitações enviadas de volta para o Modelo. O diagrama a seguir descreve como os vários objetos no MVVM se comunicam: enquanto o MVVM apresenta um modelo de implementação mais complexo, há benefícios significativos dele, que são os seguintes: Modelos ViewModels e suas interações com Modelos geralmente podem ser testados usando frameworks (como NUnit) Que são muito mais fáceis do que as aplicações que combinam a interface do usuário e as camadas de apresentação Os Modelos ViewModels geralmente podem ser reutilizados em diferentes tecnologias e plataformas de interface do usuário Esses fatores tornam a abordagem MVVM flexível e flexível. As visualizações em um aplicativo MvvmCross são implementadas usando construções específicas da plataforma. Para aplicativos iOS, as visualizações geralmente são implementadas como ViewControllers e arquivos XIB. O MvvmCross fornece um conjunto de classes base, como o MvxViewContoller. Que iOS ViewControllers herda. Os storyboards também podem ser usados ​​em conjunto com um apresentador personalizado para criar Exibições, discutiremos brevemente esta opção na seção intitulada Implementando a interface de usuário iOS mais adiante neste artigo. Para aplicativos Android, as vistas geralmente são implementadas como MvxActivity ou MvxFragment juntamente com seus arquivos de layout associados. ViewModels ViewModels são classes que fornecem dados e lógica de apresentação para visualizações em um aplicativo. Os dados são expostos a uma Vista como propriedades em um ViewModel, e a lógica que pode ser invocada em uma Vista é exposta como comandos. ViewModels herdam da classe base MvxViewModel. Os comandos são usados ​​em Modelos ViewModels para expor a lógica que pode ser invocada na Exibição em resposta às interações do usuário. A arquitetura de comando baseia-se na interface ICommand usada em vários frameworks da Microsoft, como o Windows Presentation Foundation (WPF) e o Silverlight. MvvmCross fornece IMvxCommand. Que é uma extensão do ICommand. Juntamente com uma implementação chamada MvxCommand. Os comandos geralmente são definidos como propriedades em um ViewModel. Por exemplo: Cada comando tem um método de ação definido, que implementa a lógica a ser invocada: Os comandos devem ser inicializados e o método de ação correspondente deve ser atribuído: Ligação de dados A ligação de dados facilita a comunicação entre a Vista e o ViewModel, Link de maneira que permite que os dados sejam trocados. Os recursos de vinculação de dados fornecidos pelo MvvmCross baseiam-se em recursos encontrados em várias plataformas de UI baseadas em XAML da Microsoft, como WPF e Silverlight. A idéia básica é que você gostaria de vincular uma propriedade em um controle de UI, como a propriedade Text de um controle EditText em um aplicativo Android para uma propriedade de um objeto de dados, como a propriedade de descrição do NationalPark. O diagrama a seguir descreve esse cenário: os modos de ligação Existem quatro modos de ligação diferentes que podem ser usados ​​para a ligação de dados: ligação OneWay. Este modo informa a estrutura de ligação de dados para transferir valores do ViewModel para a Visualização e transferir quaisquer atualizações para as propriedades no ViewModel para a propriedade da Vista vinculada. Ligação OneWayToSource. Este modo informa a estrutura de ligação de dados para transferir valores da Vista para o ViewModel e transferir atualizações para exibir propriedades em sua propriedade ViewModel vinculada. TwoWay binding. Este modo informa a estrutura de ligação de dados para transferir valores em ambas as direções entre o ViewModel e View, e as atualizações em qualquer objeto fará com que o outro seja atualizado. Esse modo de ligação é útil quando os valores estão sendo editados. OneTime vinculativo. Este modo informa a estrutura de ligação de dados para transferir valores de ViewModel para View quando a ligação é estabelecida neste modo, as atualizações para as propriedades do ViewModel não são monitoradas pela Visualização. A interface INotifyPropertyChanged A interface INotifyPropertyChanged é parte integrante da efetividade da vinculação de dados, funciona como um contrato entre o objeto de origem e o objeto alvo. Como o nome indica, ele define um contrato que permite que o objeto de origem notifique o objeto de destino quando os dados mudaram, permitindo assim que o destino realize todas as ações necessárias, como atualizar sua exibição. A interface consiste em um único evento do evento PropertyChanged para o qual o objeto alvo pode se inscrever e que é acionado pela fonte se uma propriedade mudar. O exemplo a seguir demonstra como implementar o INotifyPropertyChanged: Especificações de encadernação As ligações podem ser especificadas de várias maneiras. Para aplicativos Android, as ligações podem ser especificadas em arquivos de layout. O exemplo a seguir demonstra como vincular a propriedade Text de uma instância TextView à propriedade Description em uma instância NationalPark: Para iOS, a ligação deve ser realizada usando a API de ligação. CreateBinding () é um método que pode ser encontrado no MvxViewController. O exemplo a seguir demonstra como vincular a propriedade Description a uma instância UILabel: Navegando entre ViewModels Navegar entre várias telas dentro de uma aplicação é uma capacidade importante. Dentro de um aplicativo MvvmCross, isso é implementado no nível ViewModel para que a lógica de navegação possa ser reutilizada. O MvvmCross suporta a navegação entre o ViewModels através do método ShowViewModelltTgt () herdado do MvxNavigatingObject. Qual é a classe base para MvxViewModel. O exemplo a seguir demonstra como navegar para DetailViewModel: Passando parâmetros. Em muitas situações, é necessário passar informações para o ViewModel de destino. O MvvmCross fornece várias maneiras de realizar isso. O método principal é criar uma classe que contenha propriedades públicas simples e passa uma instância da classe em ShowViewModelltTgt (). O exemplo a seguir demonstra como definir e usar uma classe de parâmetros durante a navegação: Para receber e usar parâmetros, o ViewModel de destino implementa um método Init () que aceita uma instância da classe de parâmetros: organização Solutionproject Cada solução MvvmCross terá um PCL de núcleo único Projeto que abriga o código reutilizável e uma série de projetos específicos da plataforma que contêm os vários aplicativos. O diagrama a seguir descreve a estrutura geral: o processo de inicialização Os aplicativos MvvmCross geralmente seguem uma seqüência de inicialização padrão iniciada pelo código específico da plataforma dentro de cada aplicativo. Existem várias classes que colaboram para realizar o arranque. Algumas dessas classes residem no projeto principal e algumas delas residem nos projetos específicos da plataforma. As seções a seguir descrevem as responsabilidades de cada uma das classes envolvidas. O projeto principal possui uma classe App que herda da MvxApplication. A classe App contém uma substituição para o método Initialize () para que, no mínimo, ele pode registrar o primeiro ViewModel que deve ser apresentado quando o aplicativo é iniciado: os projetos Android e iOS possuem uma classe de Configuração que é responsável por criar o objeto App de O projeto central durante o arranque. Isso é realizado substituindo o método CreateApp (): Para aplicativos Android, o programa de instalação herda do MvxAndroidSetup. Para aplicativos iOS, o programa de instalação herda do MvxTouchSetup. Os aplicativos Android de inicialização do Android são iniciados usando uma tela de abertura especial da atividade que chama a classe Setup e inicia o processo de inicialização do MvvmCross. Isso tudo é feito automaticamente para você, tudo o que você precisa fazer é incluir a definição da tela inicial e se certificar de que está marcado como a atividade de inicialização. A definição é a seguinte: A inicialização do iOS A inicialização do aplicativo iOS é ligeiramente menos automatizada e é iniciada a partir do método FinishedLarunching () do AppDelegate: Criando NationalParks. MvvmCross Agora que temos conhecimento básico do framework MvvmCross, vamos colocar esse conhecimento para Trabalhe e converta o aplicativo NationalParks para aproveitar os recursos que acabamos de aprender. Criando o projeto principal do MvvmCross Vamos começar criando o projeto principal. Este projeto conterá todo o código que será compartilhado entre o iOS e o aplicativo Android principalmente na forma de ViewModels. O projeto principal será construído como uma biblioteca de classes portátil. Para criar NationalParks. Core. Execute as seguintes etapas: No menu principal, navegue até File New Solution. Na caixa de diálogo Nova Solução, navegue até Biblioteca portátil C. Entre NationalParks. Core para o campo Nome do projeto, insira NationalParks. MvvmCross para o campo Solução e clique em OK. Adicione o pacote inicial do MvvmCross ao projeto da NuGet. Selecione o projeto NationalParks. Core e navegue até Project Add Packages no menu principal. Digite MvvmCross iniciante no campo de pesquisa. Selecione a entrada MvvmCross Hot Tuna Starter Pack e clique em Adicionar pacote. Uma série de coisas foram adicionadas a NationalParks. Core como resultado da adição do pacote, e eles são os seguintes: Um arquivo packages. config, que contém uma lista de bibliotecas (dlls) associadas ao pacote do kit de inicialização do MvvmCross. Essas entradas são links para bibliotecas reais na pasta Pacotes da solução geral. Uma pasta ViewModels com uma amostra ViewModel chamada FirstViewModel. Uma classe de aplicativo no App. cs. Que contém um método Initialize () que inicia o aplicativo MvvmCross chamando RegisterAppStart () para iniciar o FirstViewModel. Eventualmente, estaremos mudando isso para iniciar a classe MasterViewModel, que será associada a uma Vista que lista parques nacionais. Criando o aplicativo Android MvvmCross O próximo passo é criar um projeto de aplicativo para Android na mesma solução. Para criar NationalParks. Droid. Conclua as seguintes etapas: Selecione a solução NationalParks. MvvmCross, clique com o botão direito do mouse e navegue até Adicionar novo projeto. Na caixa de diálogo Novo projeto, navegue até o aplicativo de Android C Android. Entre NationalParks. Droid para o campo Nome e clique em OK. Adicione o pacote do kit de inicialização do MvvmCross ao novo projeto selecionando NationalParks. Droid e navegando para Project Add Packages no menu principal. Uma série de coisas foram adicionadas ao NationalParks. Droid como resultado da adição do pacote, que são os seguintes: packages. config. Este arquivo contém uma lista de bibliotecas (dlls) associadas ao pacote do kit de inicialização do MvvmCross. Essas entradas são links para uma biblioteca real na pasta Pacotes da solução geral, que contém as bibliotecas baixas atualizadas. FirstView. Esta classe está presente na pasta Vistas, que corresponde a FirstViewModel. Que foi criado em NationalParks. Core. FirstView. Este layout está presente no Resourceslayout. Que é usado pela atividade do FirstView. Este é um arquivo de layout de Android tradicional com a exceção de que contém declarações de vinculação nos elementos EditView e TextView. Configuração . Este arquivo herda do MvxAndroidSetup. Esta classe é responsável por criar uma instância da classe App do projeto principal, que por sua vez exibe o primeiro ViewModel através de uma chamada para RegisterAppStart (). Tela de abertura . Esta classe herda do MvxSplashScreenActivity. A classe SplashScreen é marcada como a principal atividade do iniciador e, assim, inicializa o aplicativo MvvmCross com uma chamada para Setup. Initialize (). Adicione uma referência a NationalParks. Core selecionando a pasta de referências, clique com o botão direito do mouse sobre ele, selecione Editar referências. Selecione a guia Projetos, marque NationalParks. Core. E clique em OK. Remova MainActivity. cs, já que não é mais necessário e criará um erro de compilação. Isso ocorre porque está marcado como o lançamento principal e, portanto, é a nova classe do SplashScreen. Além disso, remova o arquivo de layout correspondente Resourcelayoutmain. axml. Execute o aplicativo. O aplicativo apresentará o FirstViewModel. Que está vinculado à instância do FirstView correspondente com uma classe EditView e o TextView apresenta o mesmo texto do Hello MvvmCross. À medida que você edita o texto na classe EditView, a classe TextView é atualizada automaticamente por meio da ligação de dados. A tela de captura a seguir descreve o que você deve ver: Reutilizando NationalParks. PortableData e NationalParks. IO Antes de começar a criar os Modelos de Exibições e ViewModels para nosso aplicativo, primeiro precisamos trazer algum código de nossos esforços anteriores que podem ser usados ​​para manter parques. Para isso, simplesmente reutilizaremos o NationalParksData singleton e as classes FileHandler que foram criadas anteriormente. Para reutilizar as classes NationalParksData singleton e FileHandler, conclua as seguintes etapas: Copie NationalParks. PortableData e NationalParks. IO a partir da solução criada no Capítulo 6, The Sharing Game no livro Xamarin Essentials (disponível no packtpubapplication-developmentxamarin-essentials). Para a pasta de soluções NationalParks. MvvmCross. Adicione uma referência a NationalParks. PortableData no projeto NationalParks. Droid. Crie uma pasta chamada NationalParks. IO no projeto NationalParks. Droid e adicione um link para FileHandler. cs no projeto NationalParks. IO. Lembre-se de que a classe FileHandler não pode ser contida na Biblioteca de Classes Portáteis porque usa APIs de arquivos IO que não podem ser referências de uma Biblioteca de Classes Portátil. Compile o projeto. O projeto deve compilar limpa agora. Implementando a interface INotifyPropertyChanged Usaremos a ligação de dados para vincular controles UI ao objeto NationalPark e, portanto, precisamos implementar a interface INotifyPropertyChanged. Isso garante que as alterações feitas nas propriedades de um parque sejam relatadas aos controles de UI apropriados. Para implementar INotifyPropertyChanged. Complete as seguintes etapas: Abra NationalPark. cs no projeto NationalParks. PortableData. Especifique que a classe NationalPark implementa a interface INotifyPropertyChanged. Selecione a interface INotifyPropertyChanged, clique com o botão direito do mouse nela, navegue até a interface do Refactor Implement. E pressione Enter. Digite o seguinte fragmento de código: Adicione um método OnPropertyChanged () que pode ser chamado de cada método de setter de propriedade: Atualize cada definição de propriedade para chamar o setter da mesma maneira que é representado para a propriedade Name: Compile o projeto. O projeto deve compilar de forma limpa. Agora estamos prontos para usar o NationalParksData singleton em nosso novo projeto, e ele aceita a vinculação de dados. Implementando a interface de usuário do Android Agora, estamos prontos para criar os modos de exibição e visualização necessários para o nosso aplicativo. O aplicativo que estamos criando seguirá o seguinte fluxo: uma visão de lista mestre para visualizar parques nacionais Uma exibição de detalhes para visualizar detalhes de um parque específico Uma exibição de edição para editar um parque novo ou existente O processo para criar visualizações e modelos de exibição em um Android O aplicativo geralmente consiste em três etapas diferentes: crie um ViewModel no projeto principal com os manipuladores de dados e eventos (comandos) necessários para suportar a Visualização. Crie um layout de Android com elementos visuais e especificações de ligação de dados. Crie uma atividade do Android, que corresponde ao ViewModel e exibe o layout. No nosso caso, esse processo será ligeiramente diferente porque reutilizaremos alguns dos nossos trabalhos anteriores, especificamente, os arquivos de layout e as definições do menu. Para reutilizar arquivos de layout e definições de menu, execute as seguintes etapas: Copie Master. axml. Detail. axml. E Edit. axml da pasta Resourceslayout da solução criada no Capítulo 5, Desenvolvendo sua Primeira Aplicação de Android com Xamarin. Android no livro Xamarin Essentials (disponível no packtpubapplication-developmentxamarin-essentials). Para a pasta Resourceslayout no projeto NationalParks. Droid, e adicione-os ao projeto selecionando a pasta de layout e navegando para Adicionar Adicionar Arquivos. Copie MasterMenu. xml. DetailMenu. xml. E EditMenu. xml da pasta Resourcesmenu da solução criada no Capítulo 5, Desenvolvendo sua Primeira Aplicação de Android com Xamarin. Android no livro Xamarin Essentials (disponível no packtpubapplication-developmentxamarin-essentials). Para a pasta Resourcesmenu no projeto NationalParks. Droid, e adicione-os ao projeto, selecionando a pasta de menu e navegando para Adicionar Adicionar arquivos. Implementando a visualização da lista principal Agora estamos prontos para implementar a primeira das nossas combinações ViewViewModel, que é a visão da lista principal. Criando MasterViewModel O primeiro passo é criar um ViewModel e adicionar uma propriedade que irá fornecer dados para a exibição de lista que exiba parques nacionais juntamente com algum código de inicialização. Para criar MasterViewModel. Conclua as seguintes etapas: Selecione a pasta ViewModels em NationalParks. Core. Clique com o botão direito do mouse sobre ele e navegue até Adicionar novo arquivo. Na caixa de diálogo Novo arquivo, navegue até Classe geral vazia. Digite MasterViewModel para o campo Nome e clique em Novo. Modifique a definição da classe para que o MasterViewModel herda do MvxViewModel, você também precisará adicionar algumas diretivas usando: Adicione uma propriedade que seja uma lista de elementos NationalPark para MasterViewModel. Esta propriedade será posteriormente vinculada a uma vista de lista de dados: Substitua o método Start () no MasterViewModel para carregar a coleção de parques com dados do NationalParksData singleton. Você precisará adicionar uma diretiva de uso para o espaço para nome NationalParks. PortableData novamente: agora precisamos modificar a seqüência de inicialização do aplicativo para que o MasterViewModel seja o primeiro modelo ViewModel que seja iniciado. Abra App. cs em NationalParks. Core e altere a chamada para RegisterAppStart () para referência MasterViewModel. Atualizar o layout Master. axml Update Master. axml para que ele possa aproveitar os recursos de vinculação de dados fornecidos pelo MvvmCross. Para atualizar Master. axml. Complete as seguintes etapas: Abra Master. axml e adicione uma definição de namespace na parte superior do XML para incluir o namespace NationalParks. Droid: Esta definição de namespace é necessária para permitir que o Android resolva os elementos específicos do MvvmCross que serão especificados. Altere o elemento ListView para um elemento Mvx. MvxListView: adicione uma especificação de vinculação de dados ao elemento MvxListView, vinculando a propriedade ItemsSource da exibição de lista na propriedade Parks do MasterViewModel. Da seguinte forma: adicione um atributo do modelo do item da lista à definição do elemento. Este layout controla o conteúdo de cada item que será exibido na exibição de lista: crie o layout NationalParkItem e forneça elementos TextView para exibir o nome e a descrição de um parque, da seguinte maneira: Adicione especificações de vinculação de dados a cada um dos elementos do TextView: Observe que, neste caso, o contexto para ligação de dados é uma instância de um item na coleção que foi vinculado ao MvxListView. Para este exemplo, uma instância do NationalPark. Criando a atividade MasterView Em seguida, crie o MasterView. Que é uma instância do MvxActivity que corresponde ao MasterViewModel. Para criar MasterView. Conclua as seguintes etapas: Selecione a pasta ViewModels em NationalParks. Core. Clique com o botão direito do mouse nela, navegue até Adicionar novo arquivo. Na caixa de diálogo Novo arquivo, navegue até a atividade do Android. Digite MasterView no campo Nome e selecione Novo. Modifique a especificação da classe para que ela herda da MvxActivity. Você também precisará adicionar alguns usando as diretrizes da seguinte maneira: Abra o Setup. cs e adicione o código para inicializar o manipulador de arquivos e o caminho para NationalParksData singleton para o método CreateApp (), da seguinte forma : Compile e execute o aplicativo, você precisará copiar o arquivo NationalParks. json para o dispositivo ou o emulador usando o Android Device Monitor. Todos os parques em NationalParks. json devem ser exibidos. Implementando a visualização de detalhes Agora que temos a exibição de lista principal que exibe parques nacionais, podemos nos concentrar na criação da visualização de detalhes. Seguiremos os mesmos passos para a visualização de detalhes como os que acabamos de completar para a visão principal. Criando DetailViewModel Começamos a criar DetailViewModel usando as seguintes etapas: Seguindo o mesmo procedimento que aquele que foi usado para criar MasterViewModel. Crie um novo ViewModel chamado DetailViewModel na pasta ViewModel de NationalParks. Core. Adicione uma propriedade NationalPark para suportar a vinculação de dados para os controles de exibição, da seguinte maneira: Crie uma classe de Parâmetros que pode ser usada para passar um ID de parque para o parque que deve ser exibido. É conveniente criar esta classe dentro da definição de classe do ViewModel para a qual os parâmetros são: Implementar um método Init () que aceitará uma instância da classe Parameters e obter o parque nacional correspondente de NationalParkData: Atualizando o layout Detail. axml Próximo , Atualizaremos o arquivo de layout. As principais alterações que precisam ser feitas são adicionar especificações de vinculação de dados ao arquivo de layout. Para atualizar o layout Detail. axml, execute as seguintes etapas: Abra Detail. axml e adicione o namespace do projeto ao arquivo XML: Adicione especificações de vinculação de dados a cada um dos elementos do TextView que correspondem a uma propriedade do parque nacional, conforme demonstrado para o parque Nome: Criando a atividade DetailView Agora, crie a instância MvxActivity que funcionará com DetailViewModel. Para criar DetailView. Execute as seguintes etapas: Seguindo o mesmo procedimento que aquele que foi usado para criar MasterView. Crie uma nova exibição chamada DetailView na pasta Vistas do NationalParks. Droid. Implemente os métodos OnCreateOptionsMenu () e OnOptionsItemSelected () para que nossos menus sejam acessíveis. Copie a implementação desses métodos a partir da solução criada no Capítulo 6, O Jogo Compartilhado no livro Xamarin Essentials (disponível no packtpubapplication-developmentxamarin-essentials) AR4. Comente a seção OnOptionsItemSelect () relacionada à ação Edit para agora, vamos preencher isso uma vez que a exibição de edição esteja concluída. Adicionando navegação O último passo é adicionar navegação para que, quando um item é clicado no MvxListView no MasterView. O parque é exibido na visualização de detalhes. Vamos realizar isso usando uma propriedade de comando e vinculação de dados. Para adicionar a navegação, execute as seguintes etapas: Abra o MasterViewModel e adicione uma propriedade IMvxCommand, isso será usado para gerenciar um parque que está sendo selecionado: protected IMvxCommand ParkSelected Crie um delegado de ação que será chamado quando o comando ParkSelected for executado, da seguinte maneira: Inicialize a propriedade do comando no construtor do MasterViewModel: Agora, para a última etapa, adicione uma especificação de ligação de dados ao MvvListView no Master. axml para vincular o evento ItemClick ao comando ParkClicked no MasterViewModel. Que acabamos de criar: Compile e execute o aplicativo. Ao clicar em um parque na lista, agora deve navegar até a visualização detalhada, exibindo o parque selecionado. Implementando a exibição de edição Agora estamos quase especialistas na implementação de novos Modelos View e ViewModels. Uma última exibição para ir é a exibição de edição. Criando EditViewModel Como fizemos anteriormente, começamos com o ViewModel. Para criar EditViewModel. Conclua as seguintes etapas: Seguindo o mesmo processo que foi usado anteriormente neste artigo para criar o EditViewModel. Adicione uma propriedade de ligação de dados e crie uma classe de parâmetros para navegação. Implementar um método Init () que aceitará uma instância da classe Parameters e obter o parque nacional correspondente de NationalParkData no caso de editar um parque existente ou criar uma nova instância se o usuário tiver escolhido a Nova ação. Inspecione os parâmetros passados ​​para determinar qual é a intenção: Atualizando o layout Edit. axml Update Edit. axml para fornecer especificações de vinculação de dados. Para atualizar o layout Edit. axml, primeiro você precisa abrir Edit. axml e adicionar o namespace do projeto ao arquivo XML. Em seguida, adicione as especificações de ligação de dados a cada um dos elementos EditView que correspondem a uma propriedade do parque nacional. Criando a atividade EditView Crie uma nova instância do MvxActivity chamada EditView para funcionar com o EditViewModel. Para criar o EditView. Execute as seguintes etapas: Seguindo o mesmo procedimento que o usado para criar o DetailView. Crie uma nova Vista denominada EditView na pasta Vistas do NationalParks. Droid. Implemente os métodos OnCreateOptionsMenu () e OnOptionsItemSelected () para que a ação Done seja acessada a partir do ActionBar. Você pode copiar a implementação desses métodos a partir da solução criada no Capítulo 6, O Jogo Compartilhado no livro Xamarin Essentials (disponível em packtpubapplication-developmentxamarin-essentials). Altere a implementação do Done para chamar o comando Done no EditViewModel. Adicionando navegação Adicione a navegação para dois lugares: quando New () é clicado no MasterView e quando o Edit é clicado no DetailView. Comece com o MasterView. Para adicionar navegação do MasterViewModel. Complete as seguintes etapas: Abra MasterViewModel. cs e adicione uma propriedade de comando NewParkClicked juntamente com o manipulador para o comando. Certifique-se de inicializar o comando no construtor, da seguinte maneira: Observe que não passamos uma classe de parâmetro para ShowViewModel (). Isso fará com que uma instância padrão seja criada e passada, o que significa que o ParkId será nulo. Vamos usar isso como uma forma de determinar se um novo parque deve ser criado. Agora, é hora de ligar o comando NewParkClicked até o item de menu actionNew. Não temos uma maneira de realizar isso usando a ligação de dados, então vamos recorrer a uma abordagem mais tradicional, usaremos o método OnOptionsItemSelected (). Adicione lógica para invocar o método Execute () no NewParkClicked. Da seguinte forma: Para adicionar a navegação do DetailViewModel. Complete as seguintes etapas: Abra DetailViewModel. cs e adicione uma propriedade de comando EditParkClicked junto com o manipulador para o comando. Certifique-se de inicializar o comando no construtor, conforme mostrado no seguinte trecho de código: Observe que uma instância da classe Parameters é criada, inicializada e passada para o método ShowViewModel (). Esta instância, por sua vez, será passada para o método Init () no EditViewModel. Inicialize a propriedade de comando no construtor para MasterViewModel. Da seguinte forma: Agora, atualize o método OnOptionsItemSelect () no DetailView para invocar o comando DetailView. EditPark quando a ação Edit for selecionada: Compile e execute NationalParks. Droid. Agora você deve ter um aplicativo totalmente funcional que tenha a capacidade de criar novos parques e editar os parques existentes. As alterações feitas no EditView devem ser refletidas automaticamente no MasterView e no DetailView. Criando o aplicativo MvvmCross iOS O processo de criação do aplicativo Android com o MvvmCross fornece uma sólida compreensão de como a arquitetura geral funciona. A criação da solução iOS deve ser muito mais fácil por dois motivos: primeiro, entendemos como interagir com o MvvmCross e, em segundo lugar, toda a lógica que colocamos no NationalParks. Core é reutilizável, para que possamos apenas criar a parte View do aplicativo E o código de inicialização. Para criar NationalParks. iOS. Conclua as seguintes etapas: Selecione a solução NationalParks. MvvmCross, clique com o botão direito do mouse e navegue até Adicionar novo projeto. Na caixa de diálogo Novo projeto, navegue até C iOS iPhone Single View Application. Entre NationalParks. iOS no campo Nome e clique em OK. Adicione o pacote do kit de inicialização do MvvmCross ao novo projeto selecionando NationalParks. iOS e navegando para Project Add Packages no menu principal. Uma série de coisas foram adicionadas ao NationalParks. iOS como resultado da adição do pacote. Eles são os seguintes: packages. config. Este arquivo contém uma lista de bibliotecas associadas ao pacote do kit de inicialização do MvvmCross. Essas entradas são links para uma biblioteca real na pasta Pacotes da solução geral, que contém as bibliotecas baixas atualizadas. FirstView. Essa classe é colocada na pasta Vistas, que corresponde à instância FirstViewModel criada em NationalParks. Core. Configuração . Esta classe herda do MvxTouchSetup. Esta classe é responsável por criar uma instância da classe App do projeto principal, que por sua vez exibe o primeiro ViewModel através de uma chamada para RegisterAppStart (). AppDelegate. cs. txt. Esta classe contém o código de inicialização de exemplo, que deve ser colocado no arquivo AppDelete. cs real. Implementando a interface do usuário iOS Agora estamos prontos para criar a interface do usuário para o aplicativo iOS. A boa notícia é que já temos todos os Modelos ViewModels implementados, então podemos simplesmente reutilizá-los. A má notícia é que não podemos reutilizar facilmente os storyboards do nosso trabalho anterior. Os aplicativos MvvmCross geralmente usam arquivos XIB. Uma das razões para isso é que os storyboards têm como objetivo fornecer recursos de navegação e um aplicativo MvvmCross delega essa responsabilidade para o ViewModel e o apresentador. É possível usar storyboards em combinação com um apresentador personalizado, mas o restante deste artigo se concentrará no uso de arquivos XIB, pois este é o uso mais comum. Os layouts de tela podem ser usados ​​conforme descrito na próxima captura de tela: agora estamos prontos para começar. Implementando a visão mestre A primeira visão em que trabalhamos é a visão principal. Para implementar a vista mestre, conclua as seguintes etapas: Crie uma nova classe ViewController chamada MasterView clicando com o botão direito do mouse na pasta Vistas de NationalParks. iOS e navegando para Adicionar Novo Arquivo iOS iPhone View Controller. Abra o MasterView. xib e organize os controles como visto nos layouts da tela. Adicione tomadas para cada um dos controles de edição. Abra o MasterView. cs e adicione a seguinte lógica do boilerplate para lidar com as restrições no iOS 7, da seguinte maneira: no método ViewDidLoad (), adicione lógica para criar MvxStandardTableViewSource para parksTableView: Observe que o exemplo usa o estilo da célula Subtitle e liga o parque nacional Nome e descrição do título e legenda. Adicione a lógica de ligação ao método ViewDidShow (). Na etapa anterior, nós fornecemos especificações para propriedades de UITableViewCell para propriedades no contexto de ligação. In this step, we need to set the binding context for the Parks property on MasterModelView : Compile and run the app. All the parks in NationalParks. json should be displayed. Implementing the detail view Now, implement the detail view using the following steps: Create a new ViewController instance named DetailView . Open DetailView. xib and arrange controls as shown in the following code. Add outlets for each of the edit controls. Open DetailView. cs and add the binding logic to the ViewDidShow() method: Adding navigation Add navigation from the master view so that when a park is selected, the detail view is displayed, showing the park. To add navigation, complete the following steps: Open MasterView. cs . create an event handler named ParkSelected . and assign it to the SelectedItemChanged event on MvxStandardTableViewSource . which was created in the ViewDidLoad() method: Within the event handler, invoke the ParkSelected command on MasterViewModel . passing in the selected park: Compile and run NationalParks. iOS . Selecting a park in the list view should now navigate you to the detail view, displaying the selected park. Implementing the edit view We now need to implement the last of the Views for the iOS app, which is the edit view. To implement the edit view, complete the following steps: Create a new ViewController instance named EditView . Open EditView. xib and arrange controls as in the layout screenshots. Add outlets for each of the edit controls. Open EditView. cs and add the data binding logic to the ViewDidShow() method. You should use the same approach to data binding as the approach used for the details view. Add an event handler named DoneClicked . and within the event handler, invoke the Done command on EditViewModel. protected void DoneClicked (object sender, EventArgs e) In ViewDidLoad() . add UIBarButtonItem to NavigationItem for EditView . and assign the DoneClicked event handler to it, as follows: Adding navigation Add navigation to two places: when New ( ) is clicked from the master view and when Edit is clicked on in the detail view. Lets start with the master view. To add navigation to the master view, perform the following steps: Open MasterView. cs and add an event handler named NewParkClicked . In the event handler, invoke the NewParkClicked command on MasterViewModel : In ViewDidLoad() . add UIBarButtonItem to NavigationItem for MasterView and assign the NewParkClicked event handler to it: To add navigation to the details view, perform the following steps: Open DetailView. cs and add an event handler named EditParkClicked . In the event handler, invoke the EditParkClicked command on DetailViewModel : In ViewDidLoad() . add UIBarButtonItem to NavigationItem for MasterView . and assign the EditParkClicked event handler to it: Refreshing the master view list One last detail that needs to be taken care of is to refresh the UITableView control on MasterView when items have been changed on EditView . To refresh the master view list, perform the following steps: Open MasterView. cs and call ReloadData() on parksTableView within the ViewDidAppear() method of MasterView : Compile and run NationalParks. iOS . You should now have a fully functional app that has the ability to create new parks and edit existing parks. Changes made to EditView should automatically be reflected in MasterView and DetailVIew . Considering the pros and cons After completing our work, we now have the basis to make some fundamental observations. Lets start with the pros: MvvmCross definitely increases the amount of code that can be reused across platforms. The ViewModels house the data required by the View, the logic required to obtain and transform the data in preparation for viewing, and the logic triggered by user interactions in the form of commands. In our sample app, the ViewModels were somewhat simple however, the more complex the app, the more reuse will likely be gained. As MvvmCross relies on the use of each platforms native UI frameworks, each app has a native look and feel and we have a natural layer that implements platform-specific logic when required. The data binding capabilities of MvvmCross also eliminate a great deal of tedious code that would otherwise have to be written. All of these positives are not necessarily free lets look at some cons: The first con is complexity you have to learn another framework on top of Xamarin, Android, and iOS. In some ways, MvvmCross forces you to align the way your apps work across platforms to achieve the most reuse. As the presentation logic is contained in the ViewModels, the views are coerced into aligning with them. The more your UI deviates across platforms the less likely it will be that you can actually reuse ViewModels. With these things in mind, I would definitely consider using MvvmCross for a cross-platform mobile project. Yes, you need to learn an addition framework and yes, you will likely have to align the way some of the apps are laid out, but I think MvvmCross provides enough value and flexibility to make these issues workable. Im a big fan of reuse and MvvmCross definitely pushes reuse to the next level. In this article, we reviewed the high-level concepts of MvvmCross and worked through a practical exercise in order to convert the national parks apps to use the MvvmCross framework and the increase code reuse. Resources for Article: Further resources on this subject: New Popular Posts We understand your time is important. Uniquely amongst the major publishers, we seek to develop and publish the broadest range of learning and information products on each technology. Every Packt product delivers a specific learning pathway, broadly defined by the Series type. This structured approach enables you to select the pathway which best suits your knowledge level, learning style and task objectives. As a new user, these step-by-step tutorial guides will give you all the practical skills necessary to become competent and efficient. Beginners Guide Friendly, informal tutorials that provide a practical introduction using examples, activities, and challenges. Essentials Fast paced, concentrated introductions showing the quickest way to put the tool to work in the real world. A collection of practical self-contained recipes that all users of the technology will find useful for building more powerful and reliable systems. Blueprints Guides you through the most common types of project youll encounter, giving you end-to-end guidance on how to build your specific solution quickly and reliably. Take your skills to the next level with advanced tutorials that will give you confidence to master the tools most powerful features. Accessible to readers adopting the topic, these titles get you into the tool or technology so that you can become an effective user. richardlung 2016-05-17 23:57:32 UTC 1 Im trying to create autolayout and autoresize collection view within a uitableview. so I have a picture and below it is text, which can be one line or more. But if they are in the same row, I want to get the same height. Currently, theyre somewhat working, but the height can be different for each cell in the same row. Also, Im getting constraint issues, but I think I setup the constraint correctly. Simulator Screen Shot May 17, 2016, 4.51.04 PM. png 480x852 12.9 KB jeremyd 2016-05-18 19:35:15 UTC 2 Insert a UIStackView inside your Table Cell, then set the cell content constraints to the Stack View. Not sure if there is a tutorial on it for Objective C, but there is a video series on it for Swift: Introducing Stack Views Series (Swift). richardlung 2016-05-18 22:18:56 UTC 3 Thanks, I tried adding stackview to the uitableview, and add the collectionview to the stackview. Im still getting uneven height, so it adds padding instead. (see the image on top) Although I was able to remove the constraint warnings by adding self. contentView setTranslatesAutoresizingMaskIntoConstraints:NO jeremyd 2016-05-19 02:01:52 UTC 4 My only other suggestion would be to play with each of the inserted contents constraint priorities, or make the collection views a set heightwidth and have the content set to aspect fit or fill. I wish auto layout was easier, but I find it to be one of the most difficult things to do. Takes a lot of trial and error. richardlung 2016-05-20 20:04:50 UTC 5 Yes. its really tricky. But I feel like Im really close already. I kind of get them to work (the column 2 and column 1 from my picture already using the same height), except the first column bound is smaller than the second one, and its adding padding on top and bottom. At least I want the top padding removed so I can align the picture. Powered by Discourse. Melhor visualizado com JavaScript ativado

No comments:

Post a Comment