No iOS, quais são as diferenças entre margens, inserções de borda, inserções de conteúdo, recortes de alinhamento e margens de layout. Parece haver várias opções / termos e pessoas diferentes no uso da comunidade do iOS com relação ao layout (por exemplo, UIEdgeInsets é um tipo, mas às vezes eu ouço / leio definir as inserções ou margens de layout vs guias de layout). Ive sempre foi capaz de encontrar uma opção que funciona. Mas eu nunca tenho certeza que estou usando a ferramenta certa para o trabalho. Alguém pode ajudar a fornecer alguma clareza entre esses diferentes aspectos do layout e quando usar cada um da melhor maneira. Veja também perguntas próximas a este tópico Eu tenho um UITableView e sua fonte de dados é NSFetcedResultsController. Meu controlador de resultados obtidos fornece dados ordenados como data. Eu quero adicionar um cabeçalho em mudanças de dia. Primeiro objeto do dia terá um cabeçalho, em outras palavras. Eu posso usar - (UIView) tableView: (UITableView) tableView viewForHeaderInSection: (NSInteger) seção mas seção não é bom para NSFetchedResultsController. Em vez disso, preciso de indexPath. Assim, o que devo fazer Como devo definir um cabeçalho em algumas das linhas Este é o meu código Eu tenho mesmo seguido este Este e Este. Mas ainda permanece insolúvel. Pode alguém explicar por quê. Se a eu tenho um caminho para uma polilinha guardada como seqüência ou uma série de locais. Posso desenhar uma miniatura para esse caminho Eu não quero desenhá-lo no mapView. Gostaria de saber se eu posso desenhá-lo em qualquer outra visão como imageView ou qualquer coisa semelhante. Fiquei me perguntando se alguém pode me dar dicas sobre a melhor maneira de alcançar o seguinte layout usando HTML: Eu tentei usar tabelas HTML comuns, mas estou tendo problemas para obter as diferentes linhas com colunas diferentes. Existem outras ferramentas de grade que todos vocês podem recomendar Eu preciso de uma imagem para exibir e executar um. gif e, portanto, ele deve ser executado em primeiro plano, mas a imagem que estou usando a partir de uma pasta de recursos não é o mesmo tamanho que será necessário Para ser quando realmente no programa. Eu posso mudar a propriedade BackgroundImageLayout, mas isso não faz nada para a imagem como é Imagem e não BackgroundImage Simplificando, existe alguma maneira que eu possa redimensionar uma imagem de primeiro plano sem ter que criar uma nova cópia da imagem que é o tamanho certo I Tem uma vista relativa que tem duas crianças uma vista de rolagem e um botão abaixo dela agora eu quero fazer isso: eu quero esta visão para envolver seu conteúdo e não faz espaço vazio e também não deve exceder o tamanho da tela. Como posso fazer isso pode qualquer uma ajuda aqui é o meu arquivo de layout atual que não está funcionando. É possível saber o tipo de Vista que está atualmente focado. Significa se o View I gravado em é TextView ou EditText ou Button e assim por diante. Eu tenho um controlador com um método de formulário (), este método é chamado no meu caminho para mostrar um formulário para o usuário. Neste formulário eu tenho algum script para decidir os campos a serem exibidos para o usuário. Esta decisão é baseada em informações do controlador. Informações importantes: O meu json pode ter uma estrutura de matriz ou estrutura única, como este: O meu problema é que eu não posso enviar um json do controlador para ver, eu tentei algumas maneiras, como abaixo: com o mesmo js da primeira tentativa Em ambos os casos ocorre Error Na última tentativa eu fiz o seguinte: mas na visão, são substituídos para ampquote. Em poucas palavras, preciso enviar um objeto json do controlador chamando uma blade e receber como JavaScript na visualização. A barra de lanche no meu aplicativo Android pode ter uma visão diferente da vista da atividade Minha atividade reside em um layout que tem um plano de fundo de imagem. Quando eu exibir o snack-bar nessa actividade que eu sou dificilmente capaz de ler nada como o Snack bar parece adquirir o fundo de layout. Existe alguma maneira pela qual eu posso ter snackbar com um fundo preto em uma atividade cujo layout tem um fundo de imagem Eu estou usando Xcode7.3.1. Eu tenho a configuração Autolayout na minha screen. Its funcionando perfeitamente em em iphone5,6, etc Mas no iphone4s não consigo ver a tela corretamente. Esta tela eu adicionei o espaço superior a 150. Mas a parte inferior não pode ser visível quando eu funciono o app em iphone4s. Aqui eu prendo o olhar da tela como em iphone4S. Como corrigir este problema Top Espaço olhar como no xib Eu sou novo para o desenvolvimento do IOS. Alguém pode explicar qual é a melhor maneira de projetar um aplicativo do IOS para vários tamanhos de dispositivo como (todos os Ipads e iphones) Estou confuso sobre Autolayouts, StackViews, classes de tamanho. Qual é a melhor abordagem Há um inputBar no meu viewController com um textField e dois btns, layout como este: A parte da parte laranja é o textField, e os dois btns eu havent configurá-los backgroundColor. Quando tento inserir continuamente algumas palavras enquanto o conteúdo já excedeu o escopo do textField exibido, o local onde o botão esquerdo btn, pisca uma parte do conteúdo textField que está obscurecido. Este tipo de situação só vai aparecer na introdução de caracteres chineses Existe o meu código de layout para a exibição: Tenho escrito o mesmo código de função usar Objective-C, ele ocorre o mesmo problema, Você poderia me dizer onde está o meu problema Como podemos adicionar Um UIView exatamente em bordas arredondadas de um UIImageView. Abaixo imagem mostra o que quero dizer: Estou tentando criar programaticamente uma borda de sublinhado para um UITextfield quando é um subview de um UIScrollView no meu aplicativo iOS construído com Swift. Consegui alcançar isso, mas apenas quando o UITextfield é uma subvisão da visualização, como mostra a seguinte captura de tela do meu aplicativo. Agora eu gostaria que o UITextField fosse um subview de um UIScrollView dentro da mesma vista mas a beira do sublinhado não mostra. Eu consegui criar a borda sublinhada na imagem acima criando um CALayer no método viewDidLayoutSubviews da seguinte maneira. Mas isso não funciona quando o UITextField é um subview de um UIScrollView. Isto é o que eu tentei: Alguém pode sugerir uma maneira de fazer este trabalho quando o UITextField é um subview de um UIScrollView dentro da mesma visão Eu aceitei resposta Matthias onde ele sugeriu Eu SubView um UIView como uma borda em vez de um SubLayer. Isso responde à pergunta, mas apenas de curiosidade Id apreciar alguém que também poderia explicar se é possível conseguir o mesmo com um SubLayer. Quando eu arrasto e solto um UIView no storyboard e quando eu faço o mesmo no Storyboard BAR Superior. (Onde geralmente encontramos 3 opções) A. Nome da classe. B. Primeiro Respondente. C. Sair. Então parece que é usado apenas para fornecer uma boa simetria no storyboard e para manter as coisas agradáveis e limpas. Estive procurando por muitos dias, mas não onde i encontrar algo sobre este particularmente. Eu fiz isso como abaixo: do editor assistente eu crio um objeto chamado ScoreCardView. (Há mais uma vista, devido a scrollview e, em seguida, tableView). Eu quero girar a paisagem (mesmo no modo retrato), mas a barra de guia permaneceria como está. Se estiver usando um UITextField e seu próprio UITableView no lugar de um UISearchController, então é mais fácil usar a classe GMSAutocompleteTableDataSource diretamente. Um dos exemplos de código para o GoogleMaps Cocoapod mostra como fazer isso. Procure o arquivo SDKDemoAutocompleteWithTextFieldController no diretório Pods / GoogleMaps / GoogleMapsSDKDemos / SDKDemos / PlacesSamples do seu projeto se você tiver instalado o pod ou executar o Google Apps para tentar fazer o download dos exemplos. Respondeu Mar 9 at 22:56 Sua resposta 2016 Stack Exchange, IncHeads até MvvmCross Neste artigo, por Mark Reynolds. Autor do livro Xamarin Essentials. Vamos dar o próximo passo e ver 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 projeto do MVVM Conceitos principais Views, ViewModels e comandos Ligação de dados Navegação (ViewModel para ViewModel) A organização do projeto O processo de inicialização Criando NationalParks. MvvmCross Nossa abordagem será introduzir os conceitos básicos Em um nível elevado e então mergulhar dentro e criar o app da amostra dos parques nacionais usando MvvmCross. Isso lhe dará uma compreensão básica de como usar o framework e o valor associado ao seu uso. Com isso em mente, vamos começar. (Para obter mais recursos relacionados a este tópico, veja aqui.) Introdução ao MvvmCross O MvvmCross é um framework de código aberto criado pelo Stuart Lodge. Ele é baseado no modelo de design Model-View-ViewModel (MVVM) e é projetado para melhorar a reutilização de código em diversas 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 github / MvvmCross / MvvmCross. 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 eo outro chamado ViewModel. O 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 adequado para que a interface do usuário funcione e mapeie a interação do usuário com o View em solicitações enviadas de volta ao Modelo. O seguinte diagrama mostra 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: ViewModels e suas interações com Modelos geralmente podem ser testados usando estruturas (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 ViewModels geralmente podem ser reutilizadas em diferentes tecnologias e plataformas de interface do usuário Esses fatores tornam a abordagem MVVM flexível e poderosa. Visualizações As exibições em um aplicativo MvvmCross são implementadas usando construções específicas da plataforma. Para aplicativos iOS, os modos de exibição são geralmente implementados como ViewControllers e arquivos XIB. MvvmCross fornece um conjunto de classes base, como MvxViewContoller. Que iOS ViewControllers herdam de. Storyboards também podem ser usados em conjunto com um apresentador personalizado para criar Views, discutiremos brevemente essa opção na seção intitulada Implementando a interface de usuário do iOS mais adiante neste artigo. Para aplicativos Android, os modos de exibição são geralmente implementados como MvxActivity ou MvxFragment juntamente com seus arquivos de layout associados. ViewModels Os ViewModels são classes que fornecem dados e lógica de apresentação para exibições em um aplicativo. Os dados são expostos a uma vista como propriedades de um ViewModel e a lógica que pode ser invocada a partir de uma Vista é exposta como comandos. ViewModels herdam da classe base MvxViewModel. Comandos Os comandos são usados em ViewModels para expor a lógica que pode ser invocada a partir da View em resposta às interações do usuário. A arquitetura do comando é baseada na interface ICommand usada em vários frameworks Microsoft, como Windows Presentation Foundation (WPF) e Silverlight. MvvmCross fornece IMvxCommand. Que é uma extensão do ICommand. Juntamente com uma implementação chamada MvxCommand. Os comandos são geralmente 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 eo método de ação correspondente deve ser atribuído: Ligação de dados A ligação de dados facilita a comunicação entre o View eo ViewModel, Way link que permite que os dados sejam trocados. Os recursos de vinculação de dados fornecidos pelo MvvmCross são baseados em recursos encontrados em vários frameworks de UI baseados no Microsoft XAML, como o WPF eo Silverlight. A idéia básica é que você gostaria de vincular uma propriedade em um controle de interface do usuário, como a propriedade Text de um controle EditText em um aplicativo do Android para uma propriedade de um objeto de dados, como a propriedade Description do NationalPark. O diagrama a seguir descreve esse cenário: Os modos de vinculação Existem quatro modos de vinculação diferentes que podem ser usados para ligação de dados: ligação OneWay. Este modo diz à estrutura de ligação de dados para transferir valores do ViewModel para a vista e transferir quaisquer actualizações para propriedades no ViewModel para a respectiva propriedade de vista ligada. OneWayToSource vinculativo. Este modo informa a estrutura de ligação de dados para transferir valores da Vista para o ViewModel e transferir actualizações para as propriedades da Vista para a respectiva propriedade ViewModel ligada. Ligação TwoWay. Este modo diz à estrutura de ligação de dados para transferir valores em ambas as direções entre o ViewModel e View, e atualizações em qualquer objeto fará com que o outro seja atualizado. Este modo de ligação é útil quando os valores estão a ser editados. Ligação OneTime. 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 actualizações para as propriedades do ViewModel não são monitorizadas pela Vista. A interface INotifyPropertyChanged A interface INotifyPropertyChanged é uma parte integrante de tornar o trabalho de vinculação de dados efetivamente atua como um contrato entre o objeto de origem eo objeto de destino. Como o nome indica, define um contrato que permite que o objeto de origem notifique o objeto de destino quando os dados foram alterados, permitindo assim que o alvo tome as ações necessárias, como atualizar sua exibição. A interface consiste em um evento único o evento PropertyChanged que o objeto de destino pode se inscrever e que é disparado pela origem se uma propriedade for alterada. O exemplo a seguir demonstra como implementar INotifyPropertyChanged: Encadernação especificações Ligações podem ser especificadas em um par de 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 do TextView à propriedade Description em uma instância do NationalPark: Para o iOS, a vinculação deve ser realizada usando a API de vinculaçã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 um aplicativo é 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. MvvmCross suporta navegação entre ViewModels através do uso do método ShowViewModelltTgt () herdado de MvxNavigatingObject. Que é a classe base para MvxViewModel. O exemplo a seguir demonstra como navegar até DetailViewModel: Passando parâmetros Em muitas situações, há uma necessidade de passar informações para o ViewModel de destino. MvvmCross fornece uma série de maneiras de realizar isso. O método principal é criar uma classe que contém propriedades públicas simples e passa uma instância da classe para 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 parameters: Solução / organização do projeto Cada solução MvvmCross terá um único Core PCL 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 em cada aplicativo. Existem várias classes que colaboram para realizar a inicialização de 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. App. cs O projeto principal tem uma classe App que herda de MvxApplication. A classe App contém uma substituição ao método Initialize () para que, no mínimo, ele possa registrar o primeiro ViewModel que deve ser apresentado quando o aplicativo é iniciado: Setup. cs Os projetos Android e iOS têm uma classe de Instalação responsável pela criação do App do projeto principal durante a inicialização. Isso é feito substituindo o método CreateApp (): Para aplicativos Android, o programa de instalação herda de MvxAndroidSetup. Para aplicativos iOS, o programa de instalação herda de MvxTouchSetup. Os aplicativos para Android de inicialização do Android são iniciados usando uma tela especial de inicialização da atividade que chama a classe Setup e inicia o processo de inicialização do MvvmCross. Tudo isso é feito automaticamente para você, tudo o que você precisa fazer é incluir a definição de tela de abertura e certifique-se de que está marcado como a atividade de lançamento. A definição é a seguinte: A inicialização do iOS A inicialização do aplicativo do iOS é um pouco menos automatizada e é iniciada a partir do método FinishedLaunching () do AppDelegate: Criando o NationalParks. MvvmCross Agora que temos conhecimento básico do framework MvvmCross, vamos colocar esse conhecimento para Trabalhar e converter o aplicativo NationalParks para aproveitar as capacidades que acabamos de aprender. Criando o projeto principal do MvvmCross Iniciaremos criando o projeto principal. Este projeto conterá todo o código que será compartilhado entre o iOS eo aplicativo Android principalmente na forma de ViewModels. O projeto principal será construído como uma biblioteca de classe portátil. Para criar NationalParks. Core. Execute as seguintes etapas: No menu principal, navegue até Arquivo Nova Solução. Na caixa de diálogo Nova solução, navegue até C Portable Library. Digite NationalParks. Core para o campo Nome do projeto, insira NationalParks. MvvmCross para o campo Solução e clique em OK. Adicione o pacote de inicialização MvvmCross ao projeto do NuGet. Selecione o projeto NationalParks. Core e navegue até Project Add Packages no menu principal. Digite MvvmCross starter no campo de pesquisa. Selecione a entrada MvvmCross Hot Tuna Starter Pack e clique em Adicionar Pacote. Um número de coisas foram adicionadas ao NationalParks. Core como resultado da adição do pacote, e elas são as 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 um exemplo ViewModel chamado FirstViewModel. Uma classe App em App. cs. Que contém um método Initialize () que inicia o aplicativo MvvmCross chamando RegisterAppStart () para iniciar FirstViewModel. Eventualmente, estaremos mudando isso para iniciar a classe MasterViewModel, que será associada a uma Vista que lista os parques nacionais. Criando o aplicativo MvvmCross para Android O próximo passo é criar um projeto de aplicativo Android na mesma solução. Para criar o NationalParks. Droid. Conclua as seguintes etapas: Selecione a solução NationalParks. MvvmCross, clique com o botão direito do mouse sobre ela e navegue até Adicionar Novo Projeto. Na caixa de diálogo Novo projeto, navegue até C Android Android Application. Digite NationalParks. Droid para o campo Nome e clique em OK. Adicione o pacote do kit de iniciação MvvmCross ao novo projeto selecionando NationalParks. Droid e navegue até Project Add Packages no menu principal. Um número de coisas foram adicionadas a 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 atualizadas. FirstView. Esta classe está presente na pasta Views, que corresponde a FirstViewModel. Que foi criado em NationalParks. Core. FirstView. Esse layout está presente no Resourceslayout. Que é usado pela atividade FirstView. Este é um arquivo de layout tradicional do Android, com a exceção de que ele contém declarações de vinculação nos elementos EditView e TextView. Configuração . Este arquivo herda de MvxAndroidSetup. Esta classe é responsável por criar uma instância da classe App do projeto central, que por sua vez exibe o primeiro ViewModel através de uma chamada para RegisterAppStart (). Tela de abertura . Esta classe herda de MvxSplashScreenActivity. A classe SplashScreen é marcada como a atividade principal lançador e, portanto, inicializa o aplicativo MvvmCross com uma chamada para Setup. Initialize (). Adicione uma referência a NationalParks. Core selecionando a pasta References, clique com o botão direito do mouse sobre ela e selecione Edit References. Selecione a guia Projetos, marque NationalParks. Core. E clique em OK. Remover MainActivity. cs como ele não é mais necessário e criará um erro de compilação. Isso ocorre porque ele está marcado como o lançamento principal e assim é a nova classe SplashScreen. Além disso, remova o correspondente arquivo de layout Resourceslayoutmain. axml. Executar o aplicativo. O aplicativo apresentará FirstViewModel. Que está vinculado à instância FirstView correspondente com uma classe EditView e TextView apresenta o mesmo texto Hello MvvmCross. À medida que você edita o texto na classe EditView, a classe TextView é atualizada automaticamente por meio de vinculação de dados. A seguinte captura de tela mostra o que você deve ver: Reutilizando NationalParks. PortableData e NationalParks. IO Antes de começar a criar Views 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 singleton NationalParksData e as classes FileHandler que foram criadas anteriormente. Para reutilizar as classes singleton e FileHandler de NationalParksData, execute as seguintes etapas: Copie NationalParks. PortableData e NationalParks. IO da solução criada no Capítulo 6, The Sharing Game no livro Xamarin Essentials (disponível em packtpub / application-development / xamarin-essentials ). Para a pasta de solução 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 do projeto NationalParks. IO. Lembre-se de que a classe FileHandler não pode ser contido na Biblioteca de Classes Portátil porque usa APIs de E / S de arquivo que não podem ser referências de uma biblioteca de classes portáteis. Compilar o projeto. O projeto deve compilar limpa agora. Implementando a interface INotifyPropertyChanged Estaremos usando a vinculação de dados para ligar controles UI ao objeto NationalPark e, portanto, precisamos implementar a interface INotifyPropertyChanged. Isso garante que as alterações feitas às propriedades de um parque são relatadas para os controles de interface do usuário apropriados. Para implementar INotifyPropertyChanged. Conclua 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 sobre ela, navegue até Refactor Implementar interface. E pressione Enter. Insira o snippet de código a seguir: Adicione um método OnPropertyChanged () que pode ser chamado de cada método setter de propriedade: Atualize cada definição de propriedade para chamar o setter da mesma forma como ela é descrita para a propriedade Name: Compile o projeto. O projeto deve compilar limpa. Agora estamos prontos para usar o singleton NationalParksData em nosso novo projeto, e ele suporta a vinculação de dados. Implementando a interface de usuário do Android Agora, estamos prontos para criar as Vistas e Modelos de visualização necessários para o nosso aplicativo. A aplicação que estamos a criar seguirá o seguinte fluxo: Uma vista de lista principal para ver parques nacionais Uma vista de detalhe para ver detalhes de um parque específico Uma vista de edição para editar um parque novo ou já existente O processo para criar vistas e ViewModels num Android App 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 exibição. Crie um layout Android com elementos visuais e especificações de vinculação de dados. Crie uma atividade do Android, que corresponde ao ViewModel e exibe o layout. No nosso caso, este processo será um pouco diferente, porque vamos reutilizar alguns de 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: Copiar Master. axml. Detail. axml. E Edit. axml da pasta Resourceslayout da solução criada no Capítulo 5, Desenvolvendo o Seu Primeiro Aplicativo Android com Xamarin. Android no livro Xamarin Essentials (disponível em packtpub / application-development / xamarin-essentials). Para a pasta Resourceslayout no projeto NationalParks. Droid e adicioná-los ao projeto selecionando a pasta de layout e navegar até Add Add Files. Copie MasterMenu. xml. DetailMenu. xml. E EditMenu. xml da pasta Resourcesmenu da solução criada no Capítulo 5, Desenvolvendo o Seu Primeiro Aplicativo Android com Xamarin. Android no livro Xamarin Essentials (disponível em packtpub / application-development / xamarin-essentials). Para a pasta Resourcesmenu no projeto NationalParks. Droid e adicioná-los ao projeto selecionando a pasta de menu e navegar até Add Add Files. Implementando a exibição da lista mestre Agora estamos prontos para implementar a primeira de nossas combinações View / ViewModel, que é a exibição da lista mestre. Criando MasterViewModel A primeira etapa é criar um ViewModel e adicionar uma propriedade que irá fornecer dados para a exibição de lista que exibe 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é Geral vazio classe. Digite MasterViewModel para o campo Nome e clique em Novo. Modifique a definição de classe para que MasterViewModel herde de MvxViewModel você também precisará adicionar algumas diretivas usando: Adicionar uma propriedade que é uma lista de elementos NationalPark para MasterViewModel. Esta propriedade será mais tarde vinculada a um modo de exibição de lista: Substitui o método Start () no MasterViewModel para carregar a coleção de parques com dados do singleton NationalParksData. Você precisará adicionar uma diretiva using para o namespace NationalParks. PortableData novamente: Agora precisamos modificar a seqüência de inicialização do aplicativo para que MasterViewModel seja o primeiro ViewModel thats iniciado. Abra App. cs em NationalParks. Core e altere a chamada para RegisterAppStart () para referência MasterViewModel. Atualizando o layout Master. axml Atualize 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 ao topo do XML para incluir o espaço de nomes NationalParks. Droid: Esta definição de espaço de nomes é necessária para que o Android possa resolver os elementos específicos do MvvmCross que serão especificados. Alterar o elemento ListView para um elemento Mvx. MvxListView: Adicionar uma especificação de ligação de dados para o elemento MvxListView, vinculando a propriedade ItemsSource da exibição de lista para a propriedade Parks do MasterViewModel. Da seguinte maneira: Adicione um atributo de modelo de item de 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 tanto o nome como a descrição de um parque, da seguinte maneira: Adicione especificações de vinculação de dados a cada um dos elementos TextView: Observe que, neste caso, o contexto para vinculação de dados é uma instância de um item na coleção que foi vinculado a MvxListView. Para este exemplo, uma instância do NationalPark. Criando a atividade do MasterView Em seguida, crie o MasterView. Que é uma instância de MvxActivity que corresponde a MasterViewModel. Para criar o MasterView. Conclua as seguintes etapas: Selecione a pasta ViewModels em NationalParks. Core. Clique com o botão direito do mouse sobre ele, 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 de classe para que ela herde de MvxActivity você também precisará adicionar algumas diretivas de uso da seguinte maneira: Abra Setup. cs e adicionar código para inicializar o manipulador de arquivo e caminho para o singleton NationalParksData para o CreateApp () método, da seguinte maneira : Compile e execute o aplicativo que você precisará copiar o arquivo NationalParks. json para o dispositivo ou 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 da lista mestre exibindo parques nacionais, podemos nos concentrar na criação da visualização de detalhes. Seguiremos as mesmas etapas para a visualização de detalhes que as que acabamos de concluir para a visualização principal. Criando o DetailViewModel Começamos a criar o DetailViewModel usando as seguintes etapas: Seguindo o mesmo procedimento que foi usado para criar o MasterViewModel. Crie um novo ViewModel chamado DetailViewModel na pasta ViewModel de NationalParks. Core. Adicione uma propriedade NationalPark para suportar ligação de dados para os controlos de vista, da seguinte forma: Crie uma classe Parâmetros que pode ser utilizada para passar um ID de parque para o parque que deve ser apresentado. É conveniente criar esta classe dentro da definição de classe do ViewModel que os parâmetros são para: Implementar um método Init () que aceitará uma instância da classe Parameters e obter o correspondente parque nacional de NationalParkData: Atualizando o layout Detail. axml Próximo , Vamos atualizar o arquivo de layout. As principais alterações que precisam ser feitas são para adicionar especificações de vinculação de dados para o 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 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 como aquele que foi usado para criar o MasterView. Crie uma nova vista chamada DetailView na pasta Views do NationalParks. Droid. Implemente os métodos OnCreateOptionsMenu () e OnOptionsItemSelected () para que nossos menus estejam acessíveis. Copie a implementação desses métodos a partir da solução criada no Capítulo 6, The Sharing Game no livro Xamarin Essentials (disponível em packtpub / application-development / xamarin-essentials) AR4. Comente a seção OnOptionsItemSelect () relacionada à ação Editar por agora, preencheremos essa opção uma vez que a visualização de edição seja concluída. Adicionando navegação O último passo é adicionar navegação de modo que quando um item é clicado em MvxListView no MasterView. O parque é exibido na vista de detalhes. Faremos isso usando uma propriedade de comando e vinculação de dados. Para adicionar a navegação, execute as seguintes etapas: Abra MasterViewModel e adicione uma propriedade IMvxCommand que será usada para manipular 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 forma: Inicialize a propriedade de comando no construtor de MasterViewModel: Agora, para a última etapa, adicione uma especificação de vinculação de dados para MvvListView no Master. axml para vincular o evento ItemClick ao comando ParkClicked no MasterViewModel. which we just created: Compile and run the app. Clicking on a park in the list view should now navigate to the detail view, displaying the selected park. Implementing the edit view We are now almost experts at implementing new Views and ViewModels. One last View to go is the edit view. Creating EditViewModel Like we did previously, we start with the ViewModel. To create EditViewModel . complete the following steps: Following the same process that was previously used in this article to create EditViewModel . add a data binding property and create a Parameters class for navigation. Implement an Init() method that will accept an instance of the Parameters class and get the corresponding national park from NationalParkData in the case of editing an existing park or create a new instance if the user has chosen the New action. Inspect the parameters passed in to determine what the intent is: Updating the Edit. axml layout Update Edit. axml to provide data binding specifications. To update the Edit. axml layout, you first need to open Edit. axml and add the project namespace to the XML file. Then, add the data binding specifications to each of the EditView elements that correspond to a national park property. Creating the EditView activity Create a new MvxActivity instance named EditView to will work with EditViewModel . To create EditView . perform the following steps: Following the same procedure as the one that was used to create DetailView . create a new View named EditView in the Views folder of NationalParks. Droid . Implement the OnCreateOptionsMenu() and OnOptionsItemSelected() methods so that the Done action will accessible from the ActionBar. You can copy the implementation of these methods from the solution created in Chapter 6, The Sharing Game in the book Xamarin Essentials (available at packtpub/application-development/xamarin-essentials ). Change the implementation of Done to call the Done command on EditViewModel . Adding navigation Add navigation to two places: when New ( ) is clicked from MasterView and when Edit is clicked in DetailView . Lets start with MasterView. To add navigation from MasterViewModel . complete the following steps: Open MasterViewModel. cs and add a NewParkClicked command property along with the handler for the command. Be sure to initialize the command in the constructor, as follows: Note that we do not pass in a parameter class into ShowViewModel() . This will cause a default instance to be created and passed in, which means that ParkId will be null. We will use this as a way to determine whether a new park should be created. Now, its time to hook the NewParkClicked command up to the actionNew menu item. We do not have a way to accomplish this using data binding, so we will resort to a more traditional approachwe will use the OnOptionsItemSelected() method. Add logic to invoke the Execute() method on NewParkClicked . as follows: To add navigation from DetailViewModel . complete the following steps: Open DetailViewModel. cs and add a EditParkClicked command property along with the handler for the command. Be sure to initialize the command in the constructor, as shown in the following code snippet: Note that an instance of the Parameters class is created, initialized, and passed into the ShowViewModel() method. This instance will in turn be passed into the Init() method on EditViewModel . Initialize the command property in the constructor for MasterViewModel . as follows: Now, update the OnOptionsItemSelect() method in DetailView to invoke the DetailView. EditPark command when the Edit action is selected: Compile and run NationalParks. Droid . You should now have a fully functional app that has the ability to create new parks and edit the existing parks. Changes made to EditView should automatically be reflected in MasterView and DetailView . Creating the MvvmCross iOS app The process of creating the Android app with MvvmCross provides a solid understanding of how the overall architecture works. Creating the iOS solution should be much easier for two reasons: first, we understand how to interact with MvvmCross and second, all the logic we have placed in NationalParks. Core is reusable, so that we just need to create the View portion of the app and the startup code. To create NationalParks. iOS . complete the following steps: Select the NationalParks. MvvmCross solution, right-click on it, and navigate to Add New Project . From the New Project dialog, navigate to C iOS iPhone Single View Application . enter NationalParks. iOS in the Name field, and click on OK . Add the MvvmCross starter kit package to the new project by selecting NationalParks. iOS and navigating to Project Add Packages from the main menu. A number of things were added to NationalParks. iOS as a result of adding the package. They are as follows: packages. config . This file contains a list of libraries associated with the MvvmCross starter kit package. These entries are links to an actual library in the Packages folder of the overall solution, which contains the actual downloaded libraries. FirstView . This class is placed in the Views folder, which corresponds to the FirstViewModel instance created in NationalParks. Core . Setup . This class inherits from MvxTouchSetup . This class is responsible for creating an instance of the App class from the core project, which in turn displays the first ViewModel via a call to RegisterAppStart() . AppDelegate. cs. txt . This class contains the sample startup code, which should be placed in the actual AppDelete. cs file. Implementing the iOS user interface We are now ready to create the user interface for the iOS app. The good news is that we already have all the ViewModels implemented, so we can simply reuse them. The bad news is that we cannot easily reuse the storyboards from our previous work MvvmCross apps generally use XIB files. One of the reasons for this is that storyboards are intended to provide navigation capabilities and an MvvmCross app delegates that responsibility to ViewModel and presenter. It is possible to use storyboards in combination with a custom presenter, but the remainder of this article will focus on using XIB files, as this is the more common use. The screen layouts can be used as depicted in the following screenshot: We are now ready to get started. Implementing the master view The first view we will work on is the master view. To implement the master view, complete the following steps: Create a new ViewController class named MasterView by right-clicking on the Views folder of NationalParks. iOS and navigating to Add New File iOS iPhone View Controller . Open MasterView. xib and arrange controls as seen in the screen layouts. Add outlets for each of the edit controls. Open MasterView. cs and add the following boilerplate logic to deal with constraints on iOS 7, as follows: Within the ViewDidLoad() method, add logic to create MvxStandardTableViewSource for parksTableView : Note that the example uses the Subtitle cell style and binds the national park name and description to the title and subtitle. Add the binding logic to the ViewDidShow() method. In the previous step, we provided specifications for properties of UITableViewCell to properties in the binding context. 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. Summary 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. Learning 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. Cookbook 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. Mastering Take your skills to the next level with advanced tutorials that will give you confidence to master the tools most powerful features. Starting Accessible to readers adopting the topic, these titles get you into the tool or technology so that you can become an effective user.
No comments:
Post a Comment