Suporte MVVMCross para os Storyboards Xamarin.iOS

Com suporte para integração XS de storyboards do iOS prestes a fazer o stream Stable, eu adoraria poder usar esse recurso em conjunto com o MVVMCross.

Fundamentalmente, parece um pouco que não deve funcionar, já que os storyboards indicam hierarquia de navegação no projeto de visualização, em vez de um projeto de viewmodel como o MVVMCross.

Mas seria ótimo se houvesse uma maneira de fazer os dois trabalharem juntos.

Alguém sabe como isso pode ser alcançado?

Felicidades, Tristan

Há pelo menos uma amostra publicada mostrando o uso de Storyboards – o bastante estranhamente chamado ehhttps://github.com/slodge/eh

Esta amostra trabalhou por:

Usando abordagens como essa é muito fácil adicionar Mvx Data-Binding a um aplicativo que é principalmente orientado pelo Storyboard.


Alternativamente, se os desenvolvedores preferissem deixar o sistema de navegação Mvx ShowViewModel controlar o stream de canvass – mas também prefeririam que essas canvass fossem projetadas em um storyboard, isso seria possível desenvolvendo um aplicativo MvvmCross normal, mas usando um Presenter personalizado que carrega ViewControllers do storyboard.

Na v3.1.1 do MvvmCross, você pode fazer isso no nível ViewsContainer :

  • replace uma class MyContainer de MvxTouchViewsContainer.cs
  • substitua o método protected virtual IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request) – consulte https://github.com/MvvmCross/MvvmCross/blob/b8545752f28f4e569efeaa397c3085b0373e4d8b/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxTouchViewsContainer.cs#L40
  • nessa substituição, carregue seus ViewControllers baseados em Storyboard:

      protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request) { return (IMvxTouchView)UIStoryboard.FromName("MyStoryBoard", null) .InstantiateViewController(viewType.Name); } 
  • crie seu MyContainer durante a Setup

     protected override IMvxTouchViewsContainer CreateTouchViewsContainer() { return new MyContainer(); } 
  • que deveria então funcionar …

Em um projeto grande, manter todos os pontos de vista em um único storyboard pode ser assustador.

Eu prefiro criar um storyboard por visualização; Eu modifiquei a resposta do Container in Stuart para procurar um storyboard que corresponda à class view, e volte ao storyboard principal se não for encontrado:

 public class StoryBoardContainer : MvxTouchViewsContainer { protected override IMvxTouchView CreateViewOfType(Type viewType, MvxViewModelRequest request) { UIStoryboard storyboard; try { storyboard = UIStoryboard.FromName(viewType.Name, null); } catch (Exception) { storyboard = UIStoryboard.FromName("StoryBoard", null); } return (IMvxTouchView) storyboard.InstantiateViewController(viewType.Name); } } 

Advertência 1: Para instanciar viewcontrollers dessa maneira, você deve definir o ID do Storyboard no editor:

ID do storyboard

Ressalva 2: Certifique-se de que suas visualizações herdando o MvxViewController tenham o construtor public MyView(IntPtr handle) : base(handle) , pois isso é usado para instanciar os view controllers do storyboard.

Suporte de storyboard é agora uma parte do MvvmCross. Use a abordagem de um ViewController por Storyboard como descrito na resposta de Geir, definindo o ID do Storyboard e decore suas classs parciais do MvxViewController com [MvxFromStoryboard] . Veja o código de exemplo no meu blog .

Eu fiz um projeto de amostra (TipCalc) usando mvvmcross e storyboard ios: https://github.com/nicruo/TipCalc.Storyboard

    Intereting Posts