Skip to content

Instantly share code, notes, and snippets.

@ChaseFlorell
Created May 23, 2014 03:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChaseFlorell/5a7267595a45c8dd7315 to your computer and use it in GitHub Desktop.
Save ChaseFlorell/5a7267595a45c8dd7315 to your computer and use it in GitHub Desktop.
Custom Presenter not showing appropriate ViewModel when calling `ViewModel.ShowViewModel<MyViewModel>();`
using System;
using Cirrious.CrossCore;
using Cirrious.MvvmCross.Binding.Touch.Views;
using Cirrious.MvvmCross.Touch.Views;
using Cirrious.MvvmCross.Touch.Views.Presenters;
using Cirrious.MvvmCross.ViewModels;
using FutureState.AppCore.ViewModels;
using FutureState.BreathingRoom.Touch.Ui.Controllers;
using FutureState.BreathingRoom.Touch.Ui.Fragments;
using MonoTouch.UIKit;
using SlidingPanels.Lib.PanelContainers;
namespace FutureState.BreathingRoom.Touch.Ui.Presenters
{
public class CustomPresenter : MvxTouchViewPresenter
{
private readonly UIWindow _window;
private UINavigationController _navigationController;
public CustomPresenter(UIApplicationDelegate applicationDelegate, UIWindow window)
: base(applicationDelegate, window)
{
_window = window;
}
public UIViewController RootController { get; private set; }
public override void Show(MvxViewModelRequest request)
{
var viewController = (UIViewController)Mvx.Resolve<IMvxTouchViewCreator>().CreateView(request);
RootController = new UIViewController();
// This needs to be a Tab View
if (request.ViewModelType == typeof(AuthViewModel))
{
_navigationController = new EmptyNavController(viewController);
RootController.AddChildViewController(_navigationController);
RootController.View.AddSubview(_navigationController.View);
}
if (request.ViewModelType == typeof(RootViewModel))
{
_navigationController = new SlidingPanelsNavController(viewController);
RootController.AddChildViewController(_navigationController);
RootController.View.AddSubview(_navigationController.View);
AddSlidingPanel<NavigationFragment>(PanelType.LeftPanel, 280);
}
base.Show(request);
}
protected override void SetWindowRootViewController(UIViewController controller)
{
_window.AddSubview(RootController.View);
_window.RootViewController = RootController;
}
protected void AddSlidingPanel<T>(PanelType panelType, float width) where T : MvxView
{
var nav = (SlidingPanelsNavController)_navigationController;
var controller = new UIViewController();
var frame = UIScreen.MainScreen.Bounds;
frame.Width = width;
controller.View.Frame = frame;
var viewToAdd = (T)Activator.CreateInstance(typeof(T), width, nav);
controller.Add(viewToAdd);
// Insert the view into a new container (of the right type) and insert
// that into the sliding panels controller
switch (panelType)
{
case PanelType.LeftPanel:
nav.InsertPanel(new LeftPanelContainer(controller));
break;
case PanelType.RightPanel:
nav.InsertPanel(new RightPanelContainer(controller));
break;
case PanelType.BottomPanel:
nav.InsertPanel(new BottomPanelContainer(controller));
break;
default:
throw new ArgumentException("PanelType is invalid");
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment