viewdestroy supported platforms mvxasynccommand xamarin.ios storyboard mvvmcross

xamarin.ios - supported - mvxasynccommand



MVVMCross: ¿Es posible usar Storyboard con la navegación ICommand? (2)

Hay formas de cargar un `UiViewController. Desde un guión gráfico: por ejemplo, ver la vista de carga de StoryBoard que no tiene un Segue

Si desea utilizar esta carga personalizada en mvvmcross, puede anular IMvxTouchViewCreator para que use este tipo de carga en el guión gráfico, o puede anular el presenter para que cargue la vista del guión gráfico directamente.

Sin embargo, en general, parece que estás luchando contra los guiones gráficos si trabajas de esta manera: casi toda la navegación del guión gráfico parece estar basada en secuencias. Con esto en mente, otra cosa que podría hacer es implementar un presentador personalizado y lograr que el presentador convierta las solicitudes de ShowViewModel en performSegueWithIdentifier llamadas de performSegueWithIdentifier .

He pasado los últimos días tratando de encontrar una manera de evitar la advertencia:

mvx: Advertencia: 8.93 Excepción enmascarada MissingMethodException: constructor predeterminado no encontrado para tipo FCX.iOS.TimesheetView en System.Activator.CreateInstance (tipo de System.Type, Boolean nonPublic) [0x00094] en / Developer / MonoTouch / Source / mono / mcs / class / corlib / System / Activator.cs: 326 en System.Activator.CreateInstance (tipo de System.Type) [0x00000] en /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Activator.cs:222 en Cirrious.MvvmCross.Touch.Views.MvxTouchViewsContainer.CreateView (solicitud Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x00000] en: 0 a Cirrious.MvvmCross.Touch.Views.MvxCanCreateTouchViewExtensionMethods.CreateViewControllerFor (vista IMvxCanCreateTouchView, Cirrious.MvvmCross.ViewModels.MvxViewModelRequest solicitud) [0x00000] en: 0 en Cirrious .MvvmCross.Touch.Views.Presenters.MvxTouchViewPresenter.Show (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest request) [0x00000] en: 0 en Cirrious.MvvmCross.Touch.Views.MvxTouchViewDispatcher + <> c__DisplayClass4.b__3 () [0x00000] en: 0 en Cirrious.CrossCore.Core.MvxMainThreadDispatcher.ExceptionMaskedAction (Acción System.Action) [0x00000] en: 0

Parece que la navegación está buscando este constructor:

public TimesheetView () { }

Cuando QUIERO que use este constructor (para propósitos del guión gráfico):

public TimesheetView (IntPtr handle) : base (handle) { }

He intentado enlazar un botón de una vista a la siguiente ICommand:

private MvxCommand _NewTimesheetCommand; public ICommand NewTimesheetCommand { get { _NewTimesheetCommand = _NewTimesheetCommand ?? new MvxCommand(() => { ShowViewModel<TimesheetViewModel>(new TimesheetViewModel.Parameters { Mode = TimesheetViewModel.ModeEnum.ADD }); }); return _NewTimesheetCommand; } }

Después de mirar muchas preguntas de StackOverFlow, me encontré con esta pregunta, pero casi suena que usar storyboards ME REQUIERE usar segues (en otras palabras, no hay una manera de usar ICommand para cambiar mi punto de vista).

¿MvvmCross admite guiones gráficos?

Mi pregunta principal: ¿es posible usar storyboards y cambiar la vista con viewmodel? (en lugar de usar segues de la vista)


Hmmm, acabo de implementar lo que dijo Stuart. Funciona genial. (Recuerde que los segue son inútiles de esta manera navega usando ShowViewModel dentro de viewmodels)

using System; using Cirrious.MvvmCross.Touch.Views.Presenters; using MonoTouch.UIKit; using MonoTouch.Foundation; using Cirrious.MvvmCross.Touch.Views; using Cirrious.MvvmCross.ViewModels; namespace DigitalCatalog.UI.Touch { public class StoryBoardTouchViewPresenter : MvxTouchViewPresenter { public static UIStoryboard Storyboard = null; public StoryBoardTouchViewPresenter (UIApplicationDelegate applicationDelegate, UIWindow window, string storyboardName, NSBundle StoryboardBundleOrNull = null) : base(applicationDelegate, window) { Storyboard = UIStoryboard.FromName (storyboardName, StoryboardBundleOrNull); } public override void Show (IMvxTouchView view) { MvxViewController sbView = null; try{ sbView = (MvxViewController) Storyboard.InstantiateViewController (view.Request.ViewModelType.Name.Replace("Model", "")); }catch(Exception e){ Console.WriteLine ("Failed to find storyboard view, did you forget to set the Storyboard ID to the ViewModel class name without the Model suffix ?" + e); } sbView.Request = view.Request; base.Show (sbView); } } }

Todo lo que tienes que hacer ahora es configurar AppDelegate así:

public override void FinishedLaunching (UIApplication application) { StoryBoardTouchViewPresenter sbPresenter = new StoryBoardTouchViewPresenter(this, Window,"MainStoryboard_iPad"); var setup = new Setup(this,sbPresenter); setup.Initialize(); var startup = Mvx.Resolve<IMvxAppStart>(); startup.Start(); sbPresenter.MasterNavigationController.NavigationBar.Translucent = false; sbPresenter.MasterNavigationController.SetNavigationBarHidden(false, false); }

ÚLTIMO RECUERDA FIJAR PARA CADA VISTA EN EL STORYBOARD UNA IDENTIFICACIÓN DE STORYBOARD CON EL "NOMBRE DE LA CLASE" DE LA VISTA !!!! lamentablemente no hay otra manera de obtener una vista usando la clase UIStoryboard, solo puedes obtenerla usando Storyboard Ids