为我的mvvmcross项目创建自定义演示者

时间:2014-01-08 11:51:17

标签: mvvmcross

我正在使用mvvmcross开发iOS项目。

app navigation 应用程序导航是这样的:首先它从启动画面(1)开始,它导航到(2),在3个选项之间选择的视图,在视图(3)和(4)中你得到一个列表并且还可以导航回到(2),如果选择(3)中的项目,则以模态方式导航到(5)。 最后,所有导航最终都在(6)中,一个带有汉堡菜单的视图。

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

如果有人可以帮助我或引导我看看如何为此导航方案创建自定义演示者,那将会很棒。

我正在使用MvxModalNavSupportTouchViewPresenter和SlidingPanelsNavigationViewController,但是当我从(2,4,5)导航到(6)时不知道如何交换它们

1 个答案:

答案 0 :(得分: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请求将整个UI从一个显示范例(模态导航控制器)更改为另一个(滑动面板)的情况,那么实现此目的的一种方法是实现一个具有此功能的演示者两个孩子的主持人,只是简单地切换它们。

在伪代码中,这可能如下所示:

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
    }
}

显然,在这个伪代码中有一些细节需要填写 - 例如有些视图控制器要从窗口添加和删除 - 但这只是标准的iOS操作 - 例如查看许多问题和解答,例如Changing root view controller of a iOS WindowChange rootViewController from uiviewcontroller to uinavigationcontroller