2014-01-08 31 views
3

我正在为使用mvvmcross的iOS项目工作。应用导航是这样的:首先它从启动画面(1)开始,它们导航到(2),在3个选项之间进行选择的视图,在视图(3)和(4)中获得一个列表,也可以导航回(2),如果您选择(3)中的某个项目,则以模态方式导航到(5)。最后,所有的导航结束于(6),一个汉堡包菜单的视图。为我的mvvmcross项目创建自定义演示者

所以我有传统的导航(带后退按钮),模态视图和汉堡包菜单在最后。

如果有人能够帮助我或指导我了解如何为此导航方案创建自定义演示者,那将非常棒。

我使用MvxModalNavSupportTouchViewPresenter和SlidingPanelsNavigationViewController,但不知道如何来交换他们当我从(2,4,5)导航至(6)

回答

5

演示者只是一些实现https://github.com/MvvmCross/MvvmCross/blob/develop/MvvmCross/Core/Core/Views/IMvxViewPresenter.cs

public interface IMvxViewPresenter 
{ 
    void Show(MvxViewModelRequest request); 
    void ChangePresentation(MvxPresentationHint hint); 
} 

这是非常简单的接口,它允许像ViewModels这样的共享可移植代码请求显示更改。

对于您希望Show请求将整个用户界面从一个显示范例(模式导航控制器)更改为另一个(滑动面板)的情况,则执行此操作的一种方法是实现具有两个子显示器的显示器并简单地将它们切换。

在伪代码,这可能是这样的:

public class MyPresenter : IMvxViewPresenter 
{ 
    private IMvxViewPresenter _currentPresenter; 

    private ModalPresenter _modalPresenter; 
    private SlidingPresenter _slidingPresenter; 

    private enum Style 
    { 
     Modal, Panels 
    } 

    private Style _currentStyle; 

    public MyPresenter() 
    { 
     // do whatever you need to do here to: 
     // - construct _modalPresenter and _slidingPresenter 
     // - make _modalPresenter attached to the window (via root view controller) 
     // - make _slidingPresenter hidden/unattached 

     _currentStyle = Style.Modal; 
     _currentPresenter = _modalPresenter; 
    } 


    public void Show(MvxViewModelRequest request) 
    { 
     if (_currentStyle == Style.Modal && 
      request.ViewModelType == typeof(WhateverViewModelIndicatesTheSwitchIsNeeded)) 
     { 
      DoSwitch(request); 
      return; 
     } 

     _currentPresenter.Show(request); 
    } 

    public void ChangePresentation(MvxPresentationHint hint) 
    { 
     _currentPresenter.ChangePresentation(hint); 
    } 

    private void DoSwitch(MvxViewModelRequest request) 
    { 
     // do whatever is necessary to: 
     // - remove _modalPresenter from the window 
     // - add _panelPresenter to the window 
     // - show `request` within _panelPresenter 

     _currentPresenter = _panelPresenter; 
     _currentStyle = Style.Panelsl 
    } 
} 

显然,有一些细节这个伪代码中填写 - 例如有一些viewcontrollers被添加并从窗口中删除 - 但这只是标准的iOS操作 - 例如看到很多问题和答案像Changing root view controller of a iOS WindowChange rootViewController from uiviewcontroller to uinavigationcontroller

+0

太棒了!我设法解决了问题,使用SlidingPanelsNavigationViewController作为我独特的导航控制器。非常感谢您的想法和答案。保持与mvvmcross良好的工作! –

+0

当人们说“滑动面板”导航是指他们使用Android的导航抽屉或其他东西获得的导航? –

+0

是的,我的意思是这种类型的导航抽屉 –

相关问题