【问题标题】:Create custom presenter for my mvvmcross project为我的 mvvmcross 项目创建自定义演示者
【发布时间】:2017-12-10 09:36:55
【问题描述】:

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

应用程序导航是这样的:首先它从启动屏幕 (1) 开始,然后导航到 (2),在 3 个选项之间进行选择的视图,在视图 (3) 和 (4) 中,您会得到一个列表,也可以导航返回 (2),如果您在 (3) 中选择一个项目,您将以模态方式导航到 (5)。 最后,所有导航都在 (6) 中结束,这是一个带有汉堡菜单的视图。

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

如果有人可以帮助我或指导我了解如何为此导航方案创建自定义演示者,那就太好了。

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

【问题讨论】:

    标签: mvvmcross


    【解决方案1】:

    演示者只是实现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

    【讨论】:

    • 太棒了!我设法使用 SlidingPanelsNavigationViewController 作为我独特的导航控制器解决了这个问题。非常感谢您的想法和回答。继续使用 mvvmcross 做好工作!
    • 当人们说“滑动面板”导航时,他们指的是您将使用 Android 的导航抽屉或其他东西获得的导航吗?
    • 是的,我指的是这种导航抽屉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多